相关疑难解决方法(0)

双重对齐

根据这篇文章的讨论,我理解结构成员对齐的主要原因是性能(以及一些架构限制).

如果我们将在编译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)

谢谢

c c++ structure memory-alignment

8
推荐指数
3
解决办法
7487
查看次数

为什么struct中的double成员没有在8字节边界上对齐?

这是关于内存对齐的.在下面的代码中,我预计结构中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)

c alignment

5
推荐指数
1
解决办法
1966
查看次数

标签 统计

c ×2

alignment ×1

c++ ×1

memory-alignment ×1

structure ×1