C/C++获得结构大小

peo*_*oro 11 c c++ size sizeof data-structures

今天,我惊讶地发现了这一点

当sizeof运算符应用于类,结构或联合类型时,结果是该类型的对象中的字节数,以及为在单词边界上对齐成员而添加的任何填充.结果不一定与通过添加各个成员的存储要求而计算的大小相对应.

我不知道它,我很确定这个东西打破了我的一些旧代码:读取二进制文件,我曾经有这样的结构:

struct Header
{
    union {
        char identc[4];
        uint32 ident;
    };
    uint16 version;
};
Run Code Online (Sandbox Code Playgroud)

fread通过sizeof以下方式直接读取这6个字节:

fread( &header, sizeof(header), 1, f );
Run Code Online (Sandbox Code Playgroud)

但现在sizeof(header)回来了8!


是否有可能sizeof(header)返回旧的GCC版本6,或者我的想法完全消失了?

无论如何是否有任何其他运算符(或预处理器指令或其他)让编译器知道结构有多大 - 不包括填充?

否则,从一个不需要编写太多代码的文件中读取原始数据结构的干净方法是什么?


编辑:我知道这不是读取/写入二进制数据的正确方法:根据机器的字节顺序和内容,我会得到不同的结果.无论如何,这种方法是最快的方法,我是juist试图读取一些二进制数据以快速获取其内容,而不是编写一个我将在未来使用或发布的好应用程序.

Pet*_*r M 9

你想要的是#pragma pack命令.这允许您将包装设置为您想要的任何数量.通常,您会在结构定义之前将打包值设置为1(或者是0?),然后在定义之后将其返回到默认值.

请注意,这并不能保证系统之间的可移植性.

另请参阅:使用-pragma-in-c以及关于SO的各种其他问题