我已经在一定程度上理解了结构填充和字节对齐的概念。 但我需要对下面的问题做一些澄清。结构声明如下:
struct somejunk
{
int a;
char b;
char c;
int d;
double e;
}
我的猜测是结构得到总共24个字节的大小,因为在char c
的末尾填充了2个字节,在int d
的末尾填充了4个字节。我的问题是CPU如何获取单个元素?如何获取说元素char b
?它读取结构的前8个字节并解析它吗?
答案 0 :(得分:3)
细节当然取决于特定的硬件。但是,请注意,符合C11的实现必须保证每个结构成员都是一个单独的内存位置,以用于数据争用。也就是说,如果您有一个给定的对象somejunk junk
,那么两个独立的线程必须能够正确地修改junk.b
和junk.c
,而无需任何同步。因此,char
的大小必须使得硬件可以执行此类访问而不会发明对其他内存位置的写入。
例如,在x86上,您可以说mov BYTE PTR [eax], 51
将字节值设置为*eax
,这必须与不同地址的其他内存访问互操作,而不管{{eax
的值1}}。 CPU的高速缓存一致性协议必须弄清楚如何通知其他CPU'缓存以及它如何修改包含eax
的缓存行,以便缓存得到适当的污染。