2010-06-02 5 views
3

В C# у вас есть хорошая центровка атрибуты, такие, как это:Можете ли вы явно установить структуру/выравнивание структуры на C++, как вы можете на 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

Почему, по-вашему, вам нужен этот «прекрасный контроль»? – 2010-06-02 22:01:53

+1

Нет причин, я просто изучаю C++. –

ответ

1

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

Также обратите внимание на директиву ALIGN в нижней части страницы

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) 
0

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

+0

Это не одно и то же: упорядочение полей в битовом поле является специфичным для реализации, а не спецификацией. –

Смежные вопросы