大神求救 字节对齐
内存对齐本质来说是为了cpu更快更少步骤从内存中将目标数据取全,而CPU硬件机制决定一次读取四个字节的内容。如一个struct{char, int},如果紧凑地存,会导致读第二个成员的时候,需要从内存中读两次,拼接两次结果。为了快速,所以char后面填充了3个0xcc(一般都是填这个),在pack(4)的时候。
所以第一个问题:为啥填这个,是为了减少硬件的误差的原因导致的吗。最好有详细点的电路说明。本人是物理系的,电路方面的知识能看懂,所以不用担心我不懂。
第二个,他是为了更快的读数据。那么为什么需要这个struct的大小为最大成员大小的整数倍?像一个sttuct{int,double},他是记者韩勇16个字节,其实占用12个话,也是第一个成员花费一次读操作,第二个成员花费两次读操作,为何要在第一个成员之后填充4分0xcc。为什么每个成员的偏移地址要是其大小的整数倍。求解,最后有详细的解释,没例子没事。
第三个:为何一个结构体的首地址必须为最大成员字节宽的整数倍?这个又是因为cpu读取内存的什么机制导致的?
第四个,现在假设我们认可了以下的描述:每个成员的偏移地址为其大小的整数倍,整个结构体大小为最大数据成员的整数倍。(假如对齐基数足够大的话,默认我记得是8吧。)那么现在我遇到的另一个问题就更让我崩溃了,一个类虚继承于一个基类,而这个类本身只有一个double数据成员时,其sizeof计算出来的大小死16,我们很好理解,因为有一个虚基类指针的存在。但是假如其继承两个虚基类,为何算出来的大小为20,这个不是最大宽度8的整数倍。why?使用offsetof宏查看double成员偏移首地址的确是8.那么问题就来了,这个20怎么来的。你假如是三个虚基类,你会发现时24,而double的偏移量依然是8,我表示费解,三个虚基类指针,光自己就已经是12个字节了。double的偏移量应该大于8才对,而最后的24又是怎么出来的。求解。
第五个,基类有虚函数,实继承,这个时候,看起来,简单多了,你会发现这个虚函数表指针比较听话。完全符合一个指针对于内存对齐的影响,毫无差异。而且当这个double前面多一个int类型变量的时候,他也会很配合的余那个int一起组成八字节。但是当变成虚集成,问题就又回来了。其实这个问题本质来说还是虚基类指针在内存模型方面到底咋实现的。为何如此诡异,表现,对于内存字节对齐的影响直接让人崩溃。
如上,求救。分暂时先给200分如果有谁能给出全面的解释,可再追加。
字节对齐
[解决办法]