繁体   English   中英

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

[英]Performance of DWORD vs QWORD alignment in 32 bit code

我有很多互相继承的对象,等等。

默认的Embarcadero C ++ Builder 2009已将属性中的“数据对齐”设置为QWORD。 如果将其更改为DWORD,则我的许多对象的大小都会缩小,因为通常有4个字节可用于备用,而在继承的对象中又有一个字节等。因此,累加会产生很好的效果。

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

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

另外,由于我在内存中分配了大量它们,它们是一个接一个地打包在一起,还是在它们之间也存在填充,并且这种填充也是基于项目设置的(数据对齐:QWORD / DWORD) ? 如果将对象全部分配在QWORD边界上,则更改实际对象的大小不会产生任何效果。

总体而言,需要考虑很多方面的调整:

首先,根据Wikipedia上有关“数据结构对齐”的页面 ,如果Embarcadero将所有对象对齐到8字节边界,则可能会有些例外。 该文章声称,除非是doublelong long否则GCC,VC ++和Borland的计算机不会将数据对齐为8个字节。

许多事情会强制对齐:

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

关于性能:我认为您不会在4字节对齐和8字节对齐之间看到很大的差异。 Daniel Lemire进行了测量 ,发现1字节和4字节对齐数据之间的细微差异(如有); 我希望它们在4到8个字节之间甚至更小。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM