2020-09-30:谈谈内存对齐,如何回答呢?
关注者
8被浏览
2,1215 个回答
字节对齐现在在很多情况下都没有必要了,当且仅当设备内存特别小,或者极度需要优化的时候,才需要考虑这个问题。
原理两句话就能说清楚:你吃米饭一吃吃一粒,还是一次吃一勺?
现在,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分钟就看明白了,规则是死的。
主要是要理解为什么要字节对齐:提升效率。