c++ - 数组内存分配和使用 - 四的倍数

标签 c++ arrays

这是凭内存写的,可能用词不当,但意思应该是可以理解的

我目前在大学攻读编程专业的 BIT - 我们开始使用 C++,当我们开始使用数组时,我们的 C++ 老师(一位有着奇怪想法和编程规则的老师,例如不允许任何评论)告诉我们我们应该使数组大小为 4 的倍数以提高效率:

char exampleArrayChar[ 4 ]; //Allowed
float exampleArrayChar[ 6 ]; //NOT Allowed
int exampleArrayChar[ 8 ]; //Allowed

他说这背后的原因是计算机分配内存的方式。

计算机以四个字节为一组为每个数组元素分配内存地址/位置 - 因此 8 个元素的数组在 2 个内存组中完成。

所以问题是,如果你创建一个大小为 6 的数组,它将分配 2 组,每组 4 个,但随后将这些字节中的 2 个(在 8 个中)标记为无效/无效,使它们在整个数组之前无法使用从内存中释放。

虽然这对我来说在其他计算机数学方面听起来很合理(例如 1gb = 1024mb 而不是恰好 1000),但我有兴趣了解:

  • 这有多真实,如果有的话,这样做会有什么好处
  • 这只是 C++ 吗? (我假设不是,但仍然值得一问)
  • 只是关于这方面的更多信息 - 例如,为什么是 4?计算机数学通常不是二进制的,因此不是 2 吗?

在网络上四处寻找,我无法找到任何主要用途或相关的内容。

最佳答案

float exampleArrayChar[ 6 ]; //NOT Allowed

考虑到 float 是 4 个字节(几乎是普遍的,由于 IEEE-754 编码对 float 的广泛采用),任何数量的 float 已经是四的倍数字节。你的例子是 24,没有问题。在 x86(和 x64)上,SSE 指令确实更喜欢数据以 8 字节对齐...同样,具有大小为 6 个元素 = 24 字节的 float 数组不会干扰这一点。

唯一对对齐真正重要的较大倍数是缓存行的大小,它随实现的不同而有很大差异(为 x86 编译的代码可能会发现自己在 32 字节、128 字节或其他缓存大小的 CPU 上运行,全部来自相同的机器码)。是的,缓存对齐会产生很大的性能差异,但与缓存行对齐不一定更好,事实上,对齐通常更糟,因为它会引起缓存映射的冲突,类似于 false就性能影响进行分享。

参见 What is "cache-friendly" code?Why is my program slow when looping over exactly 8192 elements?以及与这些相关的其他问题。

但是一旦你的教授到了不允许发表任何评论,你就应该去院长办公室要求退还你的学费。

关于c++ - 数组内存分配和使用 - 四的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284203/

相关文章:

java - 字符串数组到带有格式的字符串

c - 访问数组的 NULL 字符

c++ - 现在对临时工程的非 const 引用?

c++ - 关闭 VSync 但在我的 DirectX 9 应用程序中仍然获得 60FPS

c++ - Cmake 编译具有 VTK 依赖性的目录中的所有 c++ 文件

c++ - 如何将Vector转为Json对象? C++

javascript - 最好使用 Lodash 按查找表对值进行排序

c++ - 如何创建一个while循环,该循环继续循环直到在C++中输入了 'using streams'键?

javascript - 如何使用 HTML 元素设置动态 JavaScript 数组,然后为其设置属性

python - 独立移动 numpy 数组的行