我有一个包含不同类型成员的庞大结构。我知道会员根据他们的类型调整
无论如何都要找出差距在哪里?
我的意思是我有兴趣知道编译器在哪些成员之间插入了一个间隙(当然差距是多少)。
答案 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 ;
} ;
这会在f
和d
之间得到填充:
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