在典型的C或C ++ struct
中,开发人员必须以提供有效内存对齐和填充的方式显式地对数据成员进行排序,如果这是一个问题。
Google的协议缓冲区与struct
的行为非常相似,目前还不清楚这些内容的编译会如何影响内存布局。有谁知道,为了有效的内存布局,这种以特定顺序组织数据的趋势是否由协议缓冲编译器自动处理?我一直无法找到任何相关信息。
即。缓冲区实际上可能在内部对数据进行排序的方式与在protobuf的message
对象中指定的方式不同。
答案 0 :(得分:2)
在典型的C或C ++结构中,开发人员必须以提供有效内存对齐和填充的方式显式地对数据成员进行排序,如果这是一个问题。
实际上这并非完全正确。
大多数编译器(实际上我都知道)倾向于将struct元素与机器字地址对齐。他们这样做是出于性能原因,因为从字地址读取通常更便宜,只是掩盖了一些比从字地址读取更多的位,移动字,所以你要寻找的值是正确对齐的并且掩盖了不需要的位。 (当然这取决于您正在编译的架构)
那么为什么我上面引用的陈述不正确? - 由于编译器正在安排如上所述的元素,它们也为程序员提供了影响这种行为的机会。通常这是使用编译器特定的pragma完成的。
例如,GCC和MS C编译器提供pragma called "pack",允许程序员更改特定结构的编译器的对齐行为。当然,如果您选择将pack设置为'1',则内存使用情况即将发生,但这可能会影响您的运行时行为。
我所知道的是编译器对结构中成员的重新排序。