猿问
为什么structof sizeof不等于每个成员的sizeof总和?
为什么structof sizeof不等于每个成员的sizeof总和?
为什么
sizeof
操作员返回的结构尺寸大于结构成员的总尺寸?
FFIVE
浏览 933
回答 4
4回答
慕慕森
这是因为添加了填充以满足对齐约束。数据结构对齐会影响程序的性能和正确性:错误对齐访问可能是一个很难的错误(通常SIGBUS)。错误对齐的访问可能是软错误。在硬件中进行了更正,以适度降低性能。或者通过软件仿真进行校正,以降低性能。此外,原子性和其他并发保证可能会被破坏,从而导致细微的错误。以下是使用x86处理器的典型设置(所有使用的32位和64位模式)的示例:struct X{ short s; /* 2 bytes */ /* 2 padding bytes */ int i; /* 4 bytes */ char c; /* 1 byte */ /* 3 padding bytes */};struct Y{ int i; /* 4 bytes */ char c; /* 1 byte */ /* 1 padding byte */ short s; /* 2 bytes */};struct Z{ int i; /* 4 bytes */ short s; /* 2 bytes */ char c; /* 1 byte */ /* 1 padding byte */};const int sizeX = sizeof(struct X); /* = 12 */const int sizeY = sizeof(struct Y); /* = 8 */const int sizeZ = sizeof(struct Z); /* = 8 */可以通过对齐对成员进行排序来最小化结构的大小(按照基本类型中的大小排序)(Z如上例中的结构)。重要说明:C和C ++标准都声明结构对齐是实现定义的。因此,每个编译器可能选择以不同方式对齐数据,从而导致不同且不兼容的数据布局。因此,在处理将由不同编译器使用的库时,了解编译器如何对齐数据非常重要。某些编译器具有命令行设置和/或特殊#pragma语句来更改结构对齐设置。
0
0
0
婷婷同学_
这可能是由于字节对齐和填充,因此结构在平台上产生偶数个字节(或字)。例如,在Linux上的C中,有以下3种结构:#include "stdio.h"struct oneInt { int x;};struct twoInts { int x; int y;};struct someBits { int x:2; int y:6;};int main (int argc, char** argv) { printf("oneInt=%zu\n",sizeof(struct oneInt)); printf("twoInts=%zu\n",sizeof(struct twoInts)); printf("someBits=%zu\n",sizeof(struct someBits)); return 0;}具有大小(以字节为单位)的成员分别是4字节(32位),8字节(2x32位)和1字节(2 + 6位)。上面的程序(在Linux上使用gcc)将大小打印为4,8和4 - 其中最后一个结构被填充,因此它是一个单词(在我的32位平台上为4 x 8位字节)。oneInt=4twoInts=8someBits=4
0
0
0
随时随地看视频
慕课网APP
相关分类
C++
typedef入门问题
1 回答
C#
typedef入门问题
1 回答
.NET
.net 中 字符串含有超链接,如何给超链接自动加上a标签?
1 回答
请问.net 中用jquery传值安全吗?
2 回答
我要回答