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

Gar*_*nes 3 c++ arrays

这是记忆,所以我可能会误用几句话,但意思应该是可以理解的

我现在在大学,做BIT主修编程 - 我们开始使用C++,当我们开始使用数组时,我们的C++老师(一个有着奇怪想法和编程规则的老师,比如没有任何评论允许)告诉我们我们应该使我们的数组大小为4的倍数,以提高效率:

char exampleArrayChar[ 4 ]; //Allowed
float exampleArrayChar[ 6 ]; //NOT Allowed
int exampleArrayChar[ 8 ]; //Allowed
Run Code Online (Sandbox Code Playgroud)

他说这背后的原因是因为计算机进行内存分配的方式.

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

所以问题是,如果你创建了一个大小为6的数组,它会分配2组4,但是然后将这些字节中的2个(在8个中)标记为无效/无效,使它们无法使用直到整个数组从记忆.

虽然这对我来说听起来似乎是合理的其他计算机数学(例如1gb = 1024mb而不是1000)我有兴趣知道:

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

在网上环顾四周,我一直无法找到任何主要用途或相关性.

Ben*_*igt 8

float exampleArrayChar[ 6 ]; //NOT Allowed
Run Code Online (Sandbox Code Playgroud)

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

对齐真正重要的唯一更大的倍数是高速缓存行的大小,它随实现而变化很大(为x86编译的代码可能会发现自己在具有32字节,128字节或其他高速缓存大小的CPU上运行,所有这些都来自同一台机器码).并且高速缓存对齐可以产生很大的性能差异,但是与高速缓存行的对齐不一定更好,实际上对齐通常要差得多,因为它会引起高速缓存映射上的冲突,就性能命中而言类似于虚假共享被关注到.

请参阅什么是"缓存友好"代码?为什么遍历正好8192元,当我的程序慢?和其他问题相关联.

但是一旦你的教授到了没有任何意见允许你应该在院长办公室要求退还你的学费.