Представьте себе
#define CACHE_LINE_SIZE 32
sizeof(T) == 48
Теперь рассмотрим, как работает [[ align(CACHE_LINE_SIZE) ]]
. например:
[[ align(32) ]] Foo foo;
Это заставит sizeof(Foo) == 32n
для некоторых n
. то есть align () будет дополнять вас, если необходимо, чтобы такие вещи, как Foo foo[10];
, выровняли каждый foo[i]
в соответствии с запросом.
Итак, в нашем случае с sizeof(T) == 48
это означает sizeof(cache_line_storage<T>) == 64
.
Таким образом, выравнивание дает вам отступ, на который вы надеялись.
Однако это одна «ошибка» в шаблоне. Рассмотрим этот случай:
#define CACHE_LINE_SIZE 32
sizeof(T) == 32
Здесь мы в итоге получаем char pad[1];
. Что означает sizeof(cache_line_storage<T>) == 64
. Наверное, не то, что вы хотите!
Я думаю, что шаблон должен быть несколько изменен:
template <typename T, int padding>
struct pad_or_not
{
T data;
char pad[padding];
};
// specialize the 0 case
// As it is late, I am SURE I've got the specialization syntax wrong...
template <typename T, int>
struct pad_or_not<0>
{
T data;
};
template<typename T>
struct cache_line_storage {
[[ align(CACHE_LINE_SIZE) ]] pad_or_not<T, (sizeof(T) > CACHE_LINE_SIZE ? 0 : CACHE_LINE_SIZE - sizeof(T) ) > data;
};
или что-то в этом роде.