在32位代码中DWORD与QWORD对齐的性能

时间:2014-11-06 22:38:09

标签: c++ memory c++builder memory-alignment borland-c++

我有很多彼此继承的对象等。

默认Embarcadero C ++ Builder 2009已将属性中的数据对齐设置为QWORD。 如果我将其更改为DWORD,我的许多对象的大小都会缩小,因为它们通常有4个字节可供备用,并且再次在继承对象中等等。因此累积起来会产生很好的效果。

缩小它们很有吸引力,因为有时我需要在内存中分配数百万个。

我想知道为什么QWORD是32位应用程序的默认设置?我以为它实际上是DWORD。并将其更改为DWORD会产生性能问题吗?

另外,因为我在内存中分配了很多它们,它们是一个接一个地分配在一起,还是它们之间也有填充,并且这个填充也基于项目设置(Data Alignment:QWORD) / DWORD)?如果对象全部分配在QWORD边界上,则改变实际对象'尺寸不会产生净影响。

1 个答案:

答案 0 :(得分:0)

总的来说,有很多事情需要考虑进行调整:

首先,根据the Wikipedia page on Data Structure Alignment,如果Embarcadero将所有对象与8字节边界对齐,则可能有点异常。该文章声称,GCC,VC ++和Borland的计算机不会将数据对齐为8个字节,除非它是doublelong long

许多事情都强制对齐:

  • mallocoperator new将为您提供8字节对齐的内存区域。此外,如果您对mallocnew执行单独调用,则对象将无法很好地打包在一起。它们之间至少有8个左右的字节用于分配器元数据。也无法保证对象在内存中彼此靠近。
  • 堆栈帧对齐为8或16个字节,具体取决于架构
  • SSE指令需要16字节对齐数据

关于性能:我认为你不会看到4字节和8字节对齐之间存在很大差异。 Daniel Lemire measured,发现1字节和4字节对齐数据之间的差异很小(如果有的话);我希望它们在4到8个字节之间更小。

您的场景中最大的性能和内存使用差异可能来自同时为多个对象分配空间(例如,将它们存储在std::vector中),而不是为每个对象调用new个别对象。