Недавно я столкнулся с некоторыми странными проблемами при попытке проверить выравнивание данных по внешней переменной.
TryDataAlignment.c
extern __attribute__((aligned(1024))) int c;
int main()
{
printf("address of c is: %p\n", &c);
if ((((unsigned long long) (&c) & 1023) == 0)) {
printf("c is aligned at 1024 byte.\n");
}
}
Переменная c была определена в другом файле: AlignmentHelper. c
int c = 2000;
Когда я компилирую код и связываю код с gcc и выполняю исполняемый файл.
gcc TryDataAlignment.c AlignmentHelper.c ./a.out
Я вижу несколько странных выходных данных:
- адрес orignial c: 0x555555756038 => это ожидается
- c выровнен по 1024 байта. => странное
При отладке в условии if условие корректно:
p (((unsigned long long) (&c) & 1023) == 0)
0
Однако оно все равно входит в условия if.
Iпопытался использовать tempVar для проверки, и результат странный:
unsigned long long final = ((unsigned long long) (&c) & 1023);
if(final == 0) {
printf("c is aligned at 1024 byte.\n");
}
Была установлена точка останова при условии if, теперь у меня есть:
p ((unsigned long long) (&c) & 1023)
56
p final
0
Не уверен, что произошло во времячто назначение, кто-то может помочь с этим? Это известная проблема с gcc?