C 通过将结构嵌套在联合中为其生成填充字节
我当时是想重申我对结构填充的理解。我现在有一个疑问。当我这样做的时候:C 通过将结构嵌套在联合中为其生成填充字节,c,struct,C,Struct,我当时是想重申我对结构填充的理解。我现在有一个疑问。当我这样做的时候: #include <stdio.h> #define ALIGNTHIS 16 //16,Not necessarily union myunion { struct mystruct { char a; int b; } myst; char DS4Alignment[ALIGNTHIS]; }; //Main Routine int main(void) { unio
#include <stdio.h>
#define ALIGNTHIS 16 //16,Not necessarily
union myunion
{
struct mystruct
{
char a;
int b;
} myst;
char DS4Alignment[ALIGNTHIS];
};
//Main Routine
int main(void)
{
union myunion WannaPad;
printf("Union's size: %d\n\
Struct's size: %d\n", sizeof(WannaPad),
sizeof(WannaPad.myst));
return 0;
}
我不应该期望结构被填充了8个字节吗?如果我显式地将8个字节填充到结构中,那么将其嵌套在这样的联合中的全部目的都将无效
我觉得声明一个包含结构和字符数组的并集(结构的大小应该是,但不是)为更整洁的代码让路
有没有办法让它像我所希望的那样工作 默认情况下,
struct
是填充的,因此intb
字段在sizeof(int)
边界上对齐。有几种解决方法:
- 在需要的地方明确使用填充词:
chara;字符a[sizeof(int)-1];int b代码>
- 使用依赖于编译器的pragma在字节边界上打包
struct
- 使用命令行开关等
struct
是填充的,因此intb
字段在sizeof(int)
边界上对齐。有几种解决方法:
- 在需要的地方明确使用填充词:
chara;字符a[sizeof(int)-1];int b代码>
- 使用依赖于编译器的pragma在字节边界上打包
struct
- 使用命令行开关等
否,因为
struct mystruct
是独立查看/处理的。char
被3sizeof(int)-1
字节填充,以使int
正确对齐。即使某个地方的某个人有时决定在另一个类型中使用这个struct mystruct
,这种情况也不会改变
我不应该期望结构被填充了8个字节吗
否,因为
struct mystruct
是独立查看/处理的。char
被3sizeof(int)-1
字节填充,以使int
正确对齐。即使某个地方的某个人有时决定在另一个类型中使用这个结构mystruct,这一点也不会改变。从逻辑上考虑它
想象一下,我有一个包含一些基本类型的联合体:
union my_union{
int i;
long l;
double d;
float f;
};
您是否希望sizeof(int)==sizeof(double)
内部类型将始终保持其大小,但联合体将始终足够大以容纳其任何内部类型。从逻辑上考虑 想象一下,我有一个包含一些基本类型的联合体:
union my_union{
int i;
long l;
double d;
float f;
};
您是否希望sizeof(int)==sizeof(double)
内部类型将始终保持其大小,但联合将始终足够大以容纳其任何内部类型。使用什么编译器以及哪些选项?联合将足够大以容纳任何内部类型,但内部类型不会被填充以适合其他内部类型。“[…]结构的大小应该是[填充]”为什么?什么意义/用途?好处是什么?使用了什么编译器和哪些选项?联合将足够大以容纳任何内部类型,但内部类型不会被填充以适合其他内部类型。“[…]结构的大小应该是[padded]”为什么?什么意义/用途?增益是多少?
sizeof(int)
没有固定为4。@user4419802:正确&谢谢!修正…-:-)“这不会改变,即使有人在某处决定在另一个类型中使用这个结构mystruct。”啊哈!这正是我错过的。sizeof(int)
没有固定为4。@user4419802:正确&谢谢!修正…-:-)“这不会改变,即使有人在某处决定在另一个类型中使用这个结构mystruct。”啊哈!这正是我所遗漏的。我不希望它适用于您提到的原始数据类型。但是当您考虑像结构那样的用户定义的数据类型时,实际上可以应用不同的逻辑,但事实并非如此。如果我在联盟外部声明了结构并在联盟内部定义了它的一个实例,我一开始就不会感到困惑!不管怎样,谢谢:-)@Adithya它是联盟内部的原始结构还是组织结构都没有区别。那只是为了说明你的思维错误。任何类型都将被视为联合体之外的类型
。没有“不同的逻辑”可以应用。我不希望它适用于您提到的原始数据类型。但是当您考虑像结构那样的用户定义的数据类型时,实际上可以应用不同的逻辑,但事实并非如此。如果我在联盟外部声明了结构并在联盟内部定义了它的一个实例,我一开始就不会感到困惑!不管怎样,谢谢:-)@Adithya它是联盟内部的原始结构还是组织结构都没有区别。那只是为了说明你的思维错误。任何类型都将被视为联合体之外的类型
。不能应用“不同的逻辑”。