根据这篇文章的讨论,我理解结构成员对齐的主要原因是性能(以及一些架构限制).
如果我们将在编译32位x86时调查Microsoft(Visual C++),Borland/CodeGear(C++ - Builder),Digital Mars(DMC)和GNU(GCC):对齐为int4个字节,如果int未对齐,则可能会发生2行存储体读取.
我的问题是为什么不double将4字节对齐呢?4个字节对齐double也会导致2行内存库读取....
例如,在以下示例中,由于double是8对齐的,因此结构的实际大小将是sizeof(char) + (alignment for double padding) + sizeof(int) = 20 bytes.
typedef struct structc_tag{
char c;
double d;
int s;
} structc_t;
Run Code Online (Sandbox Code Playgroud)
谢谢
这是关于内存对齐的.在下面的代码中,我预计结构中b的偏移量为8(32位机器).看到这里.在那里,b总是发生在缓存行中.但事实并非如此.b全局对象中的成员struct test1似乎是对齐的.我不确定它是偶然的还是编译器是故意这样做的.
我想了解为什么编译器之后没有填充4个字节a.
struct test1
{
int a;
double b;
}t1;
int main()
{
struct test1 *p = malloc(sizeof(struct test1));
printf("sizes int %d, float %d, double %d, long double %d\n", sizeof(int), sizeof(float), sizeof(double), sizeof(long double));
printf("offset of b %d\n",(int)&(t1.b)-(int)&(t1));
printf("\naddress of b (on heap) = %p, addr of b (on data seg) = %p\n",&(p->b), &(t1.b));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是......
sizes int 4, float 4, double 8, long double 12
offset …Run Code Online (Sandbox Code Playgroud)