给定
struct S { SomeType single_element_in_the_struct; };
字符串是否总是这样,
sizeof(struct S) == sizeof(SomeType)
型或者它可能是依赖于实现的?
uajslkp61#
通常情况下是这样的,但不能保证。任何结构都可以在结构的结尾处使用未命名的填充字节,但这些字节通常用于对齐目的,如果只有单个元素,则不必担心。
vxf3dgd42#
由于结构填充,它不必相等。section 6.7.2.1 in the C99 standard声明“在结构对象中可能有未命名的填充,但不是在其开始处”。这被称为结构填充。可以添加填充以确保结构在内存中正确对齐。如果您更改其成员的顺序,则结构的exakt大小可能会更改。
kulphzqa3#
这取决于你的编译器的封装。通常一个结构的大小可以被你的系统的字长整除(例如4字节== 32位)。所以你经常会有sizeof(struct S) > sizeof(SomeType)对于大多数编译器,你可以使用编译器编译指示来修改打包大小。如果你设置了#pragma pack(1),那么大小应该相等。
sizeof(struct S) > sizeof(SomeType)
#pragma pack(1)
3条答案
按热度按时间uajslkp61#
通常情况下是这样的,但不能保证。
任何结构都可以在结构的结尾处使用未命名的填充字节,但这些字节通常用于对齐目的,如果只有单个元素,则不必担心。
vxf3dgd42#
由于结构填充,它不必相等。
section 6.7.2.1 in the C99 standard声明“在结构对象中可能有未命名的填充,但不是在其开始处”。
这被称为结构填充。可以添加填充以确保结构在内存中正确对齐。如果您更改其成员的顺序,则结构的exakt大小可能会更改。
kulphzqa3#
这取决于你的编译器的封装。通常一个结构的大小可以被你的系统的字长整除(例如4字节== 32位)。
所以你经常会有
sizeof(struct S) > sizeof(SomeType)
对于大多数编译器,你可以使用编译器编译指示来修改打包大小。如果你设置了
#pragma pack(1)
,那么大小应该相等。