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

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

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

默认的 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 字节对齐数据,除非它是 doublelong long

很多事情会强制对齐:

  • mallocoperator new 将为您提供 8 字节对齐的内存区域。此外,如果您对 mallocnew 执行单独的调用,对象将不会很好地打包在一起。它们之间至少有 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/

相关文章:

c++ - 什么是 sqlite 的好的 OO C++ 包装器

c++ - 越界操作数组,似乎无法理解其含义

c++ - boost::interprocess 互斥量并检查是否被遗弃

memory - 如何将拥有的盒子发送给子任务?

delphi - 如何构建数据库以快速访问节点

openssl - 在 C++Builder 中使用 OpenSSL

c++ - 迭代时无法读出配置文件

c# - c 尖锐的堆栈和堆

javascript - Node.js 性能和内存泄漏

c++ - 使用 C++Builder 后期绑定(bind) COM 对象