Можете ли вы явно установить структуру структуры / выравнивания в C ++, как вы можете в C #? - PullRequest
3 голосов
/ 03 июня 2010

В 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 ]

4 голосов
/ 03 июня 2010

Хм, это скорее задом наперед: вам нужен атрибут в C #, чтобы вы могли соответствовать выравниванию структуры, выбранному компилятором собственного кода. И [FieldOffset] действительно нужен только для работы с профсоюзами.

Но вы можете довольно легко добиться такого рода компоновки, вставив отступ самостоятельно:

#pragma pack(push, 1)
public struct Message
{
    int a;
    short b;
    int c;
    char padding1[12];
    long long dt;
}
#pragma pack(pop)
4 голосов
/ 03 июня 2010

Компиляторы обычно поддерживают это через #pragma, но это не то, что включено в стандарт C ++ и, следовательно, не переносимо.

Пример использования компилятора Microsoft см .: http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx

1 голос
/ 03 июня 2010

Вы можете использовать директиву компилятора "#pragma pack". Для компиляторов Microsoft посмотрите здесь http://msdn.microsoft.com/en-us/library/2e70t5y1%28VS.80%29.aspx для GCC Google является вашим firend.

Также взгляните на директиву выравнивания внизу страницы

0 голосов
/ 03 июня 2010

Я не знаком с атрибутами выравнивания C #, поэтому не могу быть уверен в этом, но это похоже на C ++ (и C) «битовые поля».

...