我有很多相互继承的对象等等。
默认的 Embarcadero C++ Builder 2009 已将属性中的数据对齐设置为 QWORD。 如果我将其更改为 DWORD,我的许多对象的大小都会缩小,因为它们通常有 4 个字节可以备用,并且在继承对象等中再次出现。所以累积起来效果很好。
缩小它们很有吸引力,因为有时我需要在内存中分配数百万个。
我想知道为什么 QWORD 是 32 位应用程序的默认设置?事实上,我希望它是 DWORD。将其更改为 DWORD 会产生性能问题吗?
此外,由于我在内存中分配了很多,它们是否分配得很好,一个接一个地打包在一起,或者它们之间是否也有填充,这个填充是否也基于项目设置(数据对齐:QWORD/双字)?如果对象全部分配在 QWORD 边界上,则更改实际对象的大小不会产生实际效果。
最佳答案
总的来说,对齐需要考虑很多事情:
首先,根据the Wikipedia page on Data Structure Alignment ,如果 Embarcadero 将所有对象对齐到 8 字节边界,则它可能有点异常。这篇文章声称 GCC、VC++ 和 Borland 的计算机不会以 8 字节对齐数据,除非它是 double
或 long long
。
很多事情会强制对齐:
malloc
和operator new
将为您提供 8 字节对齐的内存区域。此外,如果您对malloc
或new
执行单独的调用,对象将不会很好地打包在一起。它们之间至少有 8 个左右的字节用于分配器元数据。也不能保证对象在内存中彼此靠近。- 堆栈帧对齐到 8 或 16 字节,具体取决于架构
- SSE 指令需要 16 字节对齐的数据
关于性能:我认为您不会看到 4 字节和 8 字节对齐之间的巨大差异。 Daniel Lemire measured , 并发现 1 字节和 4 字节对齐数据之间的差异很小(如果有的话);我希望它们在 4 到 8 个字节之间更小。
您的场景中最大的性能和内存使用差异可能来自同时为多个对象分配空间(例如,通过将它们存储在 std::vector
中)而不是调用 new
用于每个单独的对象。
关于c++ - 32 位代码中 DWORD 与 QWORD 对齐的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26790750/