我从E.S.R The Lost Art of C Structure Packing读到这篇文章,代码如下(摘自packtest.c):
$ cat p.c
#include <stdio.h>
struct foo5 {
short s;
char c;
int flip:1;
int nybble:4;
int septet:7;
};
main(int argc, char *argv)
{
printf("sizeof(struct foo5) = %zu\n", sizeof(struct foo5));
}
$ gcc -Wpadded -o p p.c
p.c:9:1: warning: padding struct size to alignment boundary [-Wpadded]
};
^
$ ./p
sizeof(struct foo5) = 8
$ gcc -Wpadded -fpack-struct=2 -o p p.c
p.c:9:1: warning: padding struct size to alignment boundary [-Wpadded]
};
^
$ ./p
sizeof(struct foo5) = 6
那么结构的多少尾随填充将在不同的包结构大小上产生差异?我怎么能用pahole来确切地看到添加了多少填充?默认的pack-struct值为8 bytes。
答案 0 :(得分:0)
这似乎不是'尾随填充'。 C99说:
结构中的实现可以分配任何可寻址的存储单元 足以容纳一个位域。
位域不需要4个字节。
我猜pahole看不到结构,因为程序没有这些信息。 sizeof运算符获取常量,因此不需要信息。您可以在gdb中尝试info types
'以查看该类型是否可用。