代码之家  ›  专栏  ›  技术社区  ›  Gary Willoughby

你能在C++中显式地设置C++中的结构布局/对齐吗?

  •  3
  • Gary Willoughby  · 技术社区  · 14 年前

    在C中,您有很好的对齐属性,例如:

    [StructLayout(LayoutKind.Explicit)]
    public struct Message
    {
        [FieldOffset(0)]
        public int a;
        [FieldOffset(4)]
        public short b;
        [FieldOffset(6)]
        public int c;
        [FieldOffset(22)] //Leave some empty space just for the heck of it.
        public DateTime dt;
    
    }
    

    这让你可以很好地控制你的结构在内存中的布局。标准C++中有这样的事情吗?

    4 回复  |  直到 14 年前
        1
  •  4
  •   Cumbayah    14 年前

    编译器通常通过一个语法来支持它,但它不是包含在C++标准中的东西,因此不是可移植的。

    有关Microsoft编译器的示例,请参见: http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx

        2
  •  4
  •   Hans Passant    14 年前

    嗯,这是相当向后的:您需要C中的属性,这样您就可以匹配本机代码编译器选择的结构对齐方式。而且[fieldoffset]只需要处理工会。

    但是您可以通过自己插入填充来很容易地实现这种布局:

    #pragma pack(push, 1)
    public struct Message
    {
        int a;
        short b;
        int c;
        char padding1[12];
        long long dt;
    }
    #pragma pack(pop)
    
        3
  •  1
  •   Vlad    14 年前

    您可以使用“pragma pack”编译器指令。对于Microsoft编译器,请查看此处 http://msdn.microsoft.com/en-us/library/2e70t5y1%28VS.80%29.aspx 对于GCC来说,谷歌是你的火种。

    还可以查看页面底部的Align指令

        4
  •  0
  •   Éric Malenfant    14 年前

    我不熟悉C语言对齐属性,所以不能肯定这一点,但是这看起来很像C++(和C)“位字段”。