gcc pack struct会决定向结构添加多少填充吗?

gcc pack struct会决定向结构添加多少填充吗?,c,gcc,struct,bit-fields,C,Gcc,Struct,Bit Fields,我从E.S.R阅读了这篇文章,代码如下(摘自packtest.c): $cat p.c #包括 结构foo5{ 短s; 字符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-已添加WPO p.c p、 c:9:1:警告:将结构大小填充到对齐边界[-Wpadded] };

我从E.S.R阅读了这篇文章,代码如下(摘自packtest.c):

$cat p.c
#包括
结构foo5{
短s;
字符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-已添加WPO p.c
p、 c:9:1:警告:将结构大小填充到对齐边界[-Wpadded]
};
^
美元/便士
sizeof(struct foo5)=8
$gcc-Wpadded-fpack结构=2-o p.c
p、 c:9:1:警告:将结构大小填充到对齐边界[-Wpadded]
};
^
美元/便士
sizeof(结构foo5)=6

那么,在不同的包结构大小上,结构的尾随填充会有多少差异?我如何使用pahole来查看添加了多少填充物?默认的包结构值是。

这似乎不是“尾随填充”。 C99说:

一个实现可以分配任何大的可寻址存储单元 足够容纳一个位字段

在结构中,位字段不需要4个字节


我猜pahole没有看到结构,因为程序没有这些信息。sizeof运算符获取一个常量,因此不需要信息。您可以在gdb中尝试
info-types
,以查看该类型是否可用。

我发现您已经声明了一个(在堆栈上静态分配)如下
struct foo5 f5
来完成pahole工作,否则pahole将不报告任何内容。
pahole
需要
libelf
libdw
来完成工作,可能只是分析调试信息而不是剥离。因此,如果没有声明结构变量,它将发现填充没有任何用处(编译器是怎么做的)?
$ 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