2020-09-30:谈谈内存对齐,如何回答呢?

2020-09-30:谈谈内存对齐。#福大大架构师每日一题#
关注者
8
被浏览
2,121

5 个回答

昨天是volatile,今天是内存对齐,明天是不是该问加法器的电路设计原理,后天要问沙子(硅)是怎么变成芯片的

字节对齐现在在很多情况下都没有必要了,当且仅当设备内存特别小,或者极度需要优化的时候,才需要考虑这个问题。

原理两句话就能说清楚:你吃米饭一吃吃一粒,还是一次吃一勺?

现在,32位机器的cpu是弱智,他的勺子是4个bytes,那么他每次吃4个bytes效率是最高的。那么给他准备饭的时候,最好也是每次搞个4bytes。

你的struct是一顿饭 比如 :

struct A {
   char   c1ByteChar1;
   int    n4BytesInt;
   double d8BytesDouble;
   char   c1ByteChar2;
}

直觉上来讲,结构体的大小应该是1+4+8+1=14 bytes,但是刚才说了,cpu是个脑残,需要你按照他每次吃饭的勺子大小给他准备好每一口,所以实际上来讲,要在不够的位置上补0;

所以在内存里面应该是这样的

[x][ ][ ][ ]
[x][x][x][x]
[x][x][x][x][x][x][x][x]
[x][ ][ ][ ][ ][ ][ ][ ]

补完0以后结构体大小是多少一目了然:24bytes,这下cpu吃爽了,吃的快,你也高兴了。

至于为啥 第一个char补充了3个0, 最后一个char补充了7个0,这个网上一顿教程,有啥可说的,5分钟就看明白了,规则是死的。

主要是要理解为什么要字节对齐:提升效率。