Выравнивание памяти для глобальных / локальных переменных в C - PullRequest
1 голос
/ 25 августа 2011

В C, если я создам структуру, такую ​​как

typedef struct A
{
  int a;
  char b;
} sampleType __attribute__ ((aligned (128)));

Все переменные этого типа будут выровнены по 128-битной границе.

То же самое для глобальных и локальных переменныхэтот тип?Или это отличается от компилятора к компилятору?Как GCC / LLVM справляется с ними?

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Следует иметь в виду одну вещь: только переменные, использующие typedef sampleType, будут иметь указанное выравнивание принудительно.

Переменные, объявленные с использованием struct A, не будут.

И этот синтаксисрасширение GCC - другие компиляторы могут или не могут его поддерживать (MSVC не будет, я не знаю, поддерживает ли LLVM или нет).

1 голос
/ 25 августа 2011

AFAIK __attribute__ сильно зависит от компилятора. С gcc эта программа

#include <stdio.h>

typedef struct st
{
  int a;
  char b;
} st __attribute__ ((aligned (128)));

static char a;
static st b;
static char c;
static struct st d;

char e;
st f;
char g;
struct st h;

int main()
{
    char i;
    st j;
    char k;
    struct st l;

    printf("%p %p %p %p\n", &a, &b, &c, &d);
    printf("%p %p %p %p\n", &e, &f, &g, &h);
    printf("%p %p %p %p\n", &i, &j, &k, &l);
}

дает мне

0x804a100 0x804a180 0x804a188 0x804a18c
0x804a208 0x804a280 0x804a288 0x804a200
0xbfc8d87f 0xbfc8d800 0xbfc8d7ff 0xbfc8d7f4

Что это говорит?

Если действительно используется тип typedef ed (st), выравнивание происходит. Если я использую struct st, это не так.

Если это произойдет, это произойдет с static переменными, external только связанными, а также с automatic (в стеке).

Что меня смущает, так это то, что h получает адрес раньше других ...

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