您能否像在C#中一样在C ++中显式设置结构布局/对齐?

时间:2010-06-02 20:37:33

标签: c++ struct alignment

在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 个答案:

答案 0 :(得分:4)

编译器通常通过#pragma支持它,但它不是C ++标准中包含的内容,因此不可移植。

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

答案 1 :(得分:4)

Hmya,它相当倒退:您需要C#中的属性,以便您可以匹配本机代码编译器选择的结构对齐方式。并且[FieldOffset]只需要处理工会。

但是你可以通过自己插入填充来轻松实现这种布局:

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

答案 2 :(得分:1)

您可以使用“#pragma pack”编译器指令。对于Microsoft编译器,请查看此处http://msdn.microsoft.com/en-us/library/2e70t5y1%28VS.80%29.aspx以获取GCC google是您的最佳选择。

另请参阅页面底部的align指令

答案 3 :(得分:0)

我不熟悉C#对齐属性,因此无法确定这一点,但这看起来很像C ++(和C)“位字段”。