выравнивание стека x86_64 - назначение избыточных байтов - PullRequest
0 голосов
/ 16 декабря 2018

Недавно я изучал тему выравнивания памяти и связанных с ней проблем, и это привело меня к следующей программе:

#include <cstdio>
#include <cstdint>


struct XX
{
    uint8_t a;
    uint32_t b;
    uint16_t d;
    uint64_t c;
};

int main()
{
     printf("\n\ntype size: %zu\n", sizeof(XX));

     XX one;
     XX two;
     XX three;
     printf("addresses of one-three:\n\t%p\n\t%p\n\t%p\n", reinterpret_cast<void *>(&one), reinterpret_cast<void *>(&two), reinterpret_cast<void *>(&three));
     printf("\ndifference of addresses between one and two: %lu\n", reinterpret_cast<unsigned long>(&one) - reinterpret_cast<unsigned long>(&two));
     printf("difference of addresses between two and three: %lu\n", reinterpret_cast<unsigned long>(&two) - reinterpret_cast<unsigned long>(&three));
     printf("alignment of type alone: %zu\n", alignof(XX));

     XX arr[2];
     printf("\ndifference of addresses in array: %lu\n", reinterpret_cast<unsigned long>(&arr[1]) - reinterpret_cast<unsigned long>(&arr[0]));
     printf("alignment of array type: %zu\n", alignof(XX[]));
}

Я скомпилировал это с GCC 8.1.0 как:

g ++ -std = c ++ 17 -O0 main.cpp

Выходные данные говорят, что:

  • выравнивание 8-байтовое,
  • размер составляет 24 байта,
  • XX экземпляры различаются на 24 байта внутри массива (непрерывная память - не удивительно), , но на 32 байта как автономные переменные .

Почему между свободно стоящими переменными слишком много 8 байт?

...