У меня есть две структуры.
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
,
Любые идеи, как я могу достичь вышеизложенного?
Разве это не должно сработать?
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-байтовой границе.
Других решений пока нет …