在典型的C或C结构中,开发人员必须以提供有效内存对齐和填充的方式显式地对数据成员进行排序(如果这是一个问题).
谷歌的协议缓冲区的行为很像结构,目前还不清楚这些编译会如何影响内存布局.有谁知道,为了有效的内存布局,这种以特定顺序组织数据的趋势是否由协议缓冲编译器自动处理?我一直无法找到任何相关信息.
I.E.缓冲区实际上可能在内部对数据进行排序,而不是在protobuf的消息对象中指定.
最佳答案
In a typical C or C++ struct the developer must explicitly order data members in a way that provides efficient memory alignment and padding, if that is an issue.
实际上这并不完全正确.
确实,大多数编译器(实际上我都知道)倾向于将struct元素与机器字地址对齐.他们这样做是出于性能原因,因为从字地址读取通常更便宜,只是掩盖了一些比从字地址读取更多的位,移动字,所以你要寻找的值是正确对齐的并且掩盖了不需要的位. (当然这取决于您正在编译的架构)
那么为什么我上面引用的陈述不正确呢? – 由于编译器正在安排如上所述的元素,它们也为程序员提供了影响这种行为的机会.通常这是使用编译器特定的pragma完成的.
例如,GCC和MS C编译器提供了一个pragma called “pack”,它允许程序员更改特定结构的编译器的对齐行为.当然,如果您选择将pack设置为’1′,则内存使用是即可,但这可能会影响您的运行时行为.
我所知道的是,编译器对结构中成员的重新排序.