sizeof(struct)返回意外值

Geo*_*rge 10 c++ gcc struct mingw sizeof

这应该很简单,但我不知道在哪里寻找问题:

我有一个结构:

struct region
{
public:
    long long int x;
    long long int y;
    long long int width;
    long long int height;
    unsigned char scale;
};
Run Code Online (Sandbox Code Playgroud)

当我这样做时,在我期待33 岁的时候sizeof(region)给我40分.

有任何想法吗?

(mingw gcc,win x64 os)

Cla*_*diu 10

它填充结构以适应8字节边界.所以它实际上占用了40个字节的内存 - sizeof返回正确的值.

如果您希望它只需要33个字节,那么请指定packed属性:

struct region
{
public:
    long long int x;
    long long int y;
    long long int width;
    long long int height;
    unsigned char scale;
} __attribute__ ((packed));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,由于结构元素未对齐,使用`packed`结构数组会严重影响性能. (7认同)
  • 有没有办法获得某种packed_sizeof(MyStruct)?这样,可以使用struct作为unpacked并获得良好的性能,但是你可以使用struct的实际大小来从文件中读取 (2认同)
  • @codymanix:你如何将结构保存到文件中?如果你有一个解压缩的结构数组,比如10个,那么它将为文件保存400个字节.你想要读回400个字节,以获得10个正确形成的结构.读330字节会让你短暂一些.但是你也不应该保存并加载到依赖于struct padding/alignment的文件,因为不同的编译器可能会做不同的事情.将其手动打包到文件中并手动将其读回. (2认同)

And*_*ron 5

long long int每个值为8个字节. scale只有1个字节但填充对齐,因此它实际上也占用了8个字节. 5*8 = 40.

  • @George,某些架构不喜欢未对齐的数据类型 - 尽管大多数都允许这样做.不同的编译器也会做不同的事情,但是所有这些编译器都有可能获得正确的包装.Endianess可能是芯片组之间的问题.当然,大小,使用特定大小的类型,如`uint32_t`,因为这些类型的大小在芯片甚至操作系统之间有所不同. (3认同)

Naw*_*waz 5

正如其他人所说,结构被填充以进行对齐,这种填充不仅取决于成员的类型,而且还取决于它们所定义的成员的顺序.

例如,考虑这两个结构AB定义如下.两种结构在成员和类型方面都是相同的; 唯一的区别是成员定义的顺序不同:

struct A
{
    int i;
    int j;
    char c;
    char d;
};

struct B
{
    int i;
    char c;
    int j;
    char d;
};
Run Code Online (Sandbox Code Playgroud)

请问sizeof(A)等于sizeof(B)只是因为他们已经相同数量的同类型的成员?不.试着打印每个尺寸:

cout << "sizeof(A) = "<< sizeof(A) << endl;
cout << "sizeof(B) = "<< sizeof(B) << endl;
Run Code Online (Sandbox Code Playgroud)

输出:

sizeof(A) = 12
sizeof(B) = 16
Run Code Online (Sandbox Code Playgroud)

惊讶吗?请亲自查看输出:http://ideone.com/yCX4S

  • 谢谢 - 有趣 (2认同)