我知道编译器可能会在struct中添加一些填充字节。但是,当编译器发现我们从未从结构中的变量中读取时,结构的大小是否小于成员的总大小是否有可能?
struct Foo_T
{
int a;
intmax_t b;
};
void bar(void)
{
struct Foo_T foo;
foo.a=rand();
someFunction(foo.a);
//i never access foo.b, only foo.a
if(sizeof(foo)< sizeof(int)+sizeof(intmax_t))
{
//is it possible that we can end here?
}
}
答案 0 :(得分:7)
不,C standard禁止这样做。在C11中,第6.7.2.1节包含以下声明:
15在结构对象中,非位字段成员和 位域所在的单元具有增加的地址 按声明的顺序排列。 [...]内部可能有未命名的填充 一个结构对象,但不是在它的开头。
删除struct
的成员会违反成员的地址按声明顺序增加的要求。
答案 1 :(得分:3)
不,这是不可能的。当您sizeof(foo)
时,您希望得到sizeof(int) + sizeof(intmax_t)
。如果编译器会给你一个较小的大小,它将不正确地影响程序的行为,这是不允许的。
假设您将最后一个成员放在那里作为占位符&#34; dummy&#34;,以保证不使用保留的硬件寄存器,或确保正确对齐。如果编译器会删除这样的成员,那就会破坏程序。
答案 2 :(得分:0)
如果结构是在自动变量或静态变量中声明的,并且结构或其任何部分都没有以编译器不能100%理解的任何方式获取和使用其地址,则编译器可能能够更改布局结构如果使用该结构的所有代码都相应调整。重要的是,代码无法确定编译器是否做了这样的事情,除非使用语言之外的机制(例如,使用调试器查看内存布局,或访问没有定义用途的内存区域)。
答案 3 :(得分:0)
绝对不。
任何编译器应该如何预测明天你打算写?所有当前源代码不使用该元素的事实绝不保证永远不会有源代码试图访问该部分结构。