假设有
struct S {
SomeType single_element_in_the_struct;
};
它总是正确的吗?
sizeof(struct S) == sizeof(SomeType)
或者这可能取决于具体的实现?
通常情况下是这样的,但不能保证。
任何结构体都可能在其末尾有未命名填充字节(unnamed padding bytes),但这些通常用于对齐目的。如果只有一个元素,则这不是一个问题。
由于结构体填充,大小不一定相等。
C99标准的第6.7.2.1节规定:“结构体对象内可能存在无名填充,但在其开头不能有填充。”
这被称为结构体填充。为了确保结构体在内存中正确对齐,可能会添加填充。如果更改结构体成员的顺序,结构体的确切大小可能会发生变化。
这取决于编译器的打包方式。通常,结构的大小可被系统的字长整除(例如,4字节==32位)。
因此,您经常会有
sizeof(struct S) > sizeof(SomeType)
对于大多数编译器,您可以使用编译器指示修改打包大小。
如果您设置
#pragma pack(1)
那么大小应该相等。
char array[6]
时,可能会填充2个额外字节以成为4字节(32位)的整数倍。 - mctylrchar [6]
的大小为六个字节,而char [6] [2]
的大小为12个字节。我不认为与其包含的类型char [6]
对齐的类型struct S { char c [6]; };
的益处在于此。 - James McNellisstruct S = {char array[6]; char pad[2];}
。由于32位CPU无论如何都会访问8个字节,如果struct S
本身在第二个数组struct S aS[]
中,则数组的元素将对齐到对齐边界上。我不认为这很常见,但有可能发生。我曾经看到人们在直接通过fwrite / write将结构体写入二进制文件或网络套接字时假设没有这样的填充,这可能会导致错误。 - mctylr