C位域 编译器问题

如图:为什么运行结果不一样代码:struct box_props {bool opaque : 1; unsigned int fill_color : 3;unsigned int : 4;bool show_border : 1; unsigned int border_color : 3;unsigned int border_style : 2;unsigned int : 2;} box ;sizeof(box);结果为16:直接命令编译结果为4 :IDE编译TDM64-GCC 版本:5.1.0MinGW 版本:7.2.0两个编译器都用两种方式编译:命令行、IDE配置编译器运行结果:命令行:16IDE编译:4这是为什么

位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位元的形式紧凑的储存,并允许程序员对此结构的位元进行操作。这种数据结构的好处:

    可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重要。

    位段可以很方便的访问一个整数值的部分内容从而可以简化程序源代码。

    而位域这种数据结构的缺点在于,其内存分配与内存对齐的实现方式依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可移植的。

追问

我问的是,为什么同一个编译器,结果不同

追答

可能编译选项不一样。你查查看 ide设置的编译选项。

追问

大佬,我查了IDE的默认构建选项,并没有什么特别的啊

追答struct xxx {
    int a:1; 
    int b:2; 
    int c:3; 
    // ...............
    
}__attribute__((packed));

试试这种写法

追问

大佬,你好,我试过了,这样是可以正常输出的。那么为什么linux中就不需要用__attribute__((packed))呢?

追答

位域操作在c++标准里面没有强制如何实现的。编译器可以根据需要调节所需字节,以便程序优化的。

追问

OK,多谢解答

温馨提示:答案为网友推荐,仅供参考
相似回答