Есть ли простой способ (макрос?), чтобы сказать выравнивание структуры? - PullRequest
0 голосов
/ 31 августа 2009

Я понимаю, что выравнивание структуры зависит от конкретной реализации, но мне просто интересно, есть ли какой-нибудь простой способ вычисления выравнивания структуры, например:

typedef struct
{
    char c;
    int  i;
} test;

if sizeof(test) - (sizeof(char) + sizeof(int)) == 0 means alignment is  1 byte;
if sizeof(test) - (sizeof(char) + sizeof(int)) == 1 means alignment is  2 bytes;
// ...etc...

Достоверно ли верно приведенное выше предположение?

Ответы [ 3 ]

4 голосов
/ 31 августа 2009

Ваш метод ненадежен в общем случае: если вы попробовали его в этой структуре:

typedef struct
{
    int i1;
    int i2;
} test;

в результате вы получите ноль, что, вероятно, не является выравниванием.

Вот метод, который работает, хотя:

#include <stddef.h>

struct dummy
{
    char x;
    test t;
};

size_t test_alignment = offsetof(struct dummy, t);
1 голос
/ 31 августа 2009

А вот макрос, который у меня есть в наборе инструментов (используется техника caf ), чтобы получить выравнивание типа:

#define ALIGNMENT_OF(t) offsetof( struct { char x; t dummy; }, dummy)

Так что теперь вы можете использовать такие выражения как:

typedef struct
{
    char c;
    int  i;
} test;

size_t x = ALIGNMENT_OF( test);    // will likely set x = 4

Обратите внимание, что определенный компилятор может поддерживать нестандартную встроенную функцию, которую вы, возможно, предпочтете использовать (например, MSVC в какой-то момент начал поддерживать встроенную переменную __alignof()). Мой заголовок определяет ALIGNMENT_OF(), используя эту встроенную функцию, если он обнаруживает компилятор, который его поддерживает (хотя я, честно говоря, не знаю, какое преимущество обеспечивает встроенная функция).

0 голосов
/ 31 августа 2009

Если все, что вам нужно, это хорошее первое предположение, то транзитивно найдите максимальный размер самого большого неагрегированного члена в структуре и любых вложенных структурах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...