Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的联合体大小_C - Fatal编程技术网

C中的联合体大小

C中的联合体大小,c,C,C语言中的联合如何分配内存? 比如说 union st { int i; char ch; }; 该联盟的一个实例将至少占用与其最大成员相同的空间,即1个单词表示int 如果您有一个包含char和short int的联合,那么您可能最终会在堆栈上有一个单词,因为在大多数系统中,在单词边界上进行分配更有效。该联合的一个实例将至少占用与其最大成员相同的空间,即1个单词代表int 如果您有一个带有char和short int的联合,那么您可能最终会在堆栈上有一个单词,因为在大多数系统中,根据单词边界

C语言中的联合如何分配内存? 比如说

union st
{
int i;
char ch;
};

该联盟的一个实例将至少占用与其最大成员相同的空间,即1个单词表示int


如果您有一个包含
char
short int
的联合,那么您可能最终会在堆栈上有一个单词,因为在大多数系统中,在单词边界上进行分配更有效。

该联合的一个实例将至少占用与其最大成员相同的空间,即1个单词代表int


如果您有一个带有
char
short int
的联合,那么您可能最终会在堆栈上有一个单词,因为在大多数系统中,根据单词边界进行分配更有效。

它应该与其最大的成员一样大。它必须至少有这么大,而且没有理由再大。

它应该和它最大的成员一样大。它必须至少有这么大,而且没有理由变大。

联合中,所有成员共享相同的内存空间(或者,按照标准的规定,如果您获取任何成员的地址,您将得到相同的结果-除了类型之外)。显然,
联合体的大小是其最大成员的大小


因此,该标准只允许一个
union
成员同时处于“活动”状态,即如果您写入
i
,则只能从
i
读取,直到写入其他成员。否则会导致未定义的行为,这通常是由于重新解释其他类型的位而得到垃圾结果。

联合中
所有成员共享相同的内存空间(或者,按照标准中的规定,如果您获取任何成员的地址,您将得到相同的结果-除了类型之外). 显然,
联合体的大小是其最大成员的大小


因此,该标准只允许一个
union
成员同时处于“活动”状态,即如果您写入
i
,则只能从
i
读取,直到写入其他成员。不这样做会导致未定义的行为,这通常会从重新解释其他类型的位中得到垃圾结果。

我认为
int
通常是dword,而不是word。@Andrey:我认为您的是x86 ism,“本机字”开始是16位,所以32位整数是dword,即使本地机器字变成了32位,他们也保留了自己的名字。但由于标准从未提及此类术语,我会完全避免使用它们,只是说它与
int
一样大。我认为
int
通常是dword,而不是word。@Andrey:我认为您的是x86 ism,“本机字”是16位开始的,所以32位整数是dword,即使本地机器字变成了32位,他们也保留了自己的名字。但由于标准从未提及此类术语,我会完全避免使用它们,只是说它与
int
一样大。那么填充呢?大多数编译器都会报告一个sizeof(),它使一个unions/structs字对齐的数组。但是你不能假设是这种情况,所以它实际上不起作用。我倾向于认为填充是编译器在需要时可以做的一点额外的事情:它不会对我使用的任何C构造的大小产生任何影响。如果您将数据写入存储,它将产生影响。这是真的,但我认为您会关心当/如果发生这种情况。如果您的对象永远不会写入存储,那么强调对齐和大小是过早的优化。那么填充呢?大多数编译器都会报告一个sizeof(),它使一个unions/structs字对齐的数组。但是你不能假设是这种情况,所以它实际上不起作用。我倾向于认为填充是编译器在需要时可以做的一点额外的事情:它不会对我使用的任何C构造的大小产生任何影响。如果您将数据写入存储,它将产生影响。这是真的,但我认为您会关心当/如果发生这种情况。如果你的对象永远不会被写入存储,那么强调对齐和大小是过早的优化。可能的重复可能的重复我不确定你第二段中的断言是否完全正确:我认为联合的目的是很容易地将一种类型转换为另一种类型。(例如,我会使用
union{float decimal;struct{char high;char midhigh;char midlow;char low;}}
将一个float拆分为它的组件字节(反之亦然)。@CajunLuke:这是经常被利用的特定于实现的,但标准说,在分配给另一个union后从一个union的成员读取是UB。这()在我的机器上,用例分别输出12、8和16的大小(尽管ideone似乎说12、8和12).据我所知,工会的规模不是其最大成员的规模,但至少是这个规模,而且可能更大。我不确定你第二段中的断言是否完全正确:我认为工会的目的是很容易将一种类型转换为另一种类型。(例如,我会使用
工会。){float decimal;struct{char high;char midhight;char midlow;char low;}}
将浮点拆分为其组件字节(或反之亦然)。@CajunLuke:这是经常被利用的特定于实现的,但标准规定,在分配给另一个联合后读取联合的成员是UB。这()在我的机器上,用例分别输出12、8和16的大小(虽然ideone似乎说12、8和12)。据我所知,联盟的大小不是最大成员的大小,而是至少是该大小,可能更大。