Как использовать размер в __align__ для выравнивания кэша при использовании GCC?

У меня есть две структуры.

t_struct_inner {
int a;
... // a lot more members
}

t_struct_outer {
t_struct_inner[1000] inners;
t_struct_outer* next;
}

Я маллок t_struct_outer в моем коде. я хочу t_struct_inner быть выровненным кешем.
Мое решение заключается в использовании

 __attribute__((aligned(
((sizeof(t_struct_inner)/CACHE_LINE_SIZE)+1) * CACHE_LINE_SIZE
)))

Но, очевидно, я не могу сделать это, поскольку я не могу использовать sizeof Вот. Я не хочу жестко задавать значение для aligned,
Любые идеи, как я могу достичь вышеизложенного?

5

Решение

Разве это не должно сработать?

struct __attribute__((aligned(CACHE_LINE_SIZE))) t_struct_inner {
int a;
... // more members.
};

Изменить: Предположим, что ваша строка кэша имеет длину 128 байт, а члены t_struct_inner имеют общий размер 259 байт. Из-за выравнивания 128 байтов следующий массив:

t_struct_inner my_array[2];

имеет длину (3 * 128) * 2 байта. Атрибут (выровненный) заставляет каждый элемент массива быть выровненным по 128-байтовой границе.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]