Как динамически выровнять переменную структуры? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть структура, которая имеет много переменных, и мне нужно выровнять некоторые переменные в середине структуры динамически.Например, у меня есть следующая структура, и я хочу выровнять x5 в кеш-линию, используя posix_memalign или что-то еще.Возможно ли это?

struct many_vars {
    uint32_t x1;
    uint32_t x2;

    uint64_t x3;
    uint64_t x4;

    // ... 

    uint64_t x5;
    uint64_t x6;

    // ... 

    uint64_t x7;
    uint64_t x8;

}

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

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

  • Возможно, ваше выравнивание не учитывает выравнивание, выполняемое компилятором, и вы будете бороться с ним.Чтобы это работало, сначала необходимо отключить все оптимизации выравнивания, выполняемые компилятором.Таким образом, ваш код и компилятор не борются.
  • Компилятор, вероятно, будет лучше выравнивать, чем вы.Он разработан на основе более тщательного изучения проблемы выравнивания, и, вероятно, вы не будете рассматривать случаи, когда выравнивание может быть организовано намного лучше.Он может обрабатывать сотни альтернатив и выбирать лучшие, когда вы не способны рассмотреть такое количество случаев.На мой взгляд, лучше позволить компилятору выполнить этот этап разработки программы.На тот случай, если вы захотите проверить свои навыки и проиграть бой с компилятором, вы не можете дать никаких рекомендаций.Чтобы это работало (по крайней мере, лучше, чем это делает компилятор), вы должны быть очень опытными в выравнивании памяти.И авторы компилятора.
0 голосов
/ 27 декабря 2018

Я так думаю.Вы должны быть в состоянии сделать это:

typedef struct my_struct_optional_name {
    uint32_t ui32_1;
    uint32_t ui32_2;
    char char_1;
    // compiler inserts padding unless #pragma pack is in effect
    uint64_t ui64_1;
} my_struct_t;
my_struct_t *my_struct = aligned_alloc(64, sizeof(my_struct_t));
...