C中对齐结构的差距

时间:2014-11-02 16:20:27

标签: c struct memory-alignment

我有一个包含不同类型成员的庞大结构。我知道会员根据他们的类型调整 无论如何都要找出差距在哪里?
我的意思是我有兴趣知道编译器在哪些成员之间插入了一个间隙(当然差距是多少)。

3 个答案:

答案 0 :(得分:5)

它取决于平台,您可以使用offsetof宏通过小型测试程序来确定它,或者对于大多数Unix系统,您可以参考您的架构的System V ABI文档。

通常,在任何成员之前插入额外的空格,否则会不正确地对齐,没有任何重新排序,最后是否会导致数组中的下一个结构错误对齐。

struct s { short a; int b; };
offsetof(struct s, a) == 0
offsetof(struct s, b) == 4 // for example
sizeof(short) == 2

Gap是a和b之间的两个字节。

要检测结构末尾的填充,只需查看结构的大小以及最后一个元素的偏移量和大小。

struct s2 { int a; short b; };
offsetof(struct s2, b) == 4
sizeof(struct s2) == 8

答案 1 :(得分:4)

使用offsetof()

中定义的stddef.h
struct my
{
    float f ;
    double d ;
} ;

这会在fd之间得到填充:

size_t p = offsetof(struct my , d) - ( offsetof(struct my , f) + sizeof(float) );

为结构的每个成员执行此操作。

答案 2 :(得分:0)

如果您不想使用offsetof宏,则可以通过指针并将所有内容转换为char *艰难地 。示例:

#include <stdio.h>

struct my_struct {
    char c;
    short h;
    char c2;
    long l;
};

void display(FILE *fd) {
    struct my_struct ms;
    int delta1 = (char *)(void *) &ms.h - (char *)(void*) &ms.c;
    int gap1 = delta1 - sizeof(char);
    int delta2 = (char *)(void *) &ms.c2 - (char *)(void*) &ms.h;
    int gap2 = delta2 - sizeof(short);
    int delta3 = (char *)(void *) &ms.l - (char *)(void*) &ms.c2;
    int gap3 = delta3 - sizeof(char);
    int gap4 = sizeof(ms) -sizeof(long) - ((char *)(void *) &ms.l - (char *)(void*) &ms);
    fprintf(fd, "char to short : %d - short to char %d - char to long %d - struct to struct : %d\n",
        gap1, gap2, gap3, gap4);
}
int main() {
    display(stderr);
}

给出:

char to short : 1 - short to char 0 - char to long 3 - struct to struct : 0