在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 ++中有这样的东西吗?
答案 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)“位字段”。