проблема выравнивания g ++ - PullRequest
0 голосов
/ 26 января 2010

У меня есть следующий код:

#include <stdio.h>

int main(void)
{
    int x __attribute__ ((aligned (16))) = 0;
    printf("%lX\n", &x);
    return 0;
}

Компиляция и запуск этого кода с использованием mingw32-c ++. Exe (GCC) 3.4.5 (mingw-vista special r3) печатает 0x22FF24, что составляет 0b1000101111111100100100.Компиляция и запуск этого кода с использованием g ++ (Debian 4.3.2-1.1) 4.3.2 печатает 0x7FFFF470EE90, что составляет 0b11111111111111111110100011100001110111010010000.

Из-за выравнивания я ожидаю, что последние 7 бит адреса переменной будутнуль.Я делаю ошибку в рассуждениях здесь?Что происходит?

Заранее спасибо,

Себастьян

Ответы [ 2 ]

2 голосов
/ 26 января 2010

16 = 2 4 , поэтому я ожидаю, что последние 4 бита адреса будут равны нулю, если адрес был выровнен по 16-байтовой границе.

Как правило, стек не гарантируется каким-либо выравниванием на x86, см. Ошибка 16660 . Кроме того, GCC зависит от компоновщика для выравнивания глобальных / общих переменных, и binutils до 2.20 не были в состоянии сделать это в Windows.

1 голос
/ 26 января 2010

Проверьте ответ на вопрос GCC __attribute__((aligned(x)) объяснение , которое говорит:

Потому что указатель стека может быть что-нибудь, когда функция запускается, нет способа выровнять массив без выделения намного больше, чем вы нужно и отрегулировать

...