Существующие вопросы в этой области, которые все еще не задают конкретно мой вопрос:
Ответ на второй фактически заставляет меня задать этот вопрос.
Итак, предполагая, что я хочу иметь конструктивный вмешательство. И я помещаю несколько переменных в единую структуру, которая соответствует std::hardware_constructive_interference_size
:
struct together
{
int a;
int b;
};
Преимущество кажется слишком слабым, чтобы запретить компиляцию с static_assert
, если она не подходит:
// Not going to do the below:
static_assert(sizeof(together) <= std::hardware_constructive_interference_size);
По-прежнему выравнивание полезно, чтобы избежать диапазона структуры:
struct alignas(std::hardware_constructive_interference_size) together
{
int a;
int b;
};
Однако тот же эффект может быть достигнут с выравниванием только по размеру структуры:
struct alignas(std::bit_ceil(2*sizeof(int))) together
{
int a;
int b;
};
Если размер структуры больше std::hardware_constructive_interference_size
, все же может быть полезно выровнять его по размеру структуры, потому что:
- Это подсказка времени компиляции, которая может устареть с более поздними процессорами, на которых скомпилированная программа запускается
- Это один из размеров строки кэша уровней кеша, если их больше одной, превышение одной строки кеша уровня кеша может по-прежнему давать полезное совместное использование строки кэша другого уровня
- Выравнивание по размеру структуры не даст намного большего чем вдвое больше накладных расходов. Выравнивание по размеру строки кэша потенциально может вызвать дополнительные накладные расходы, если размер строки кеша станет намного больше, чем размер структуры.
Итак, есть ли смысл для std::hardware_constructive_interference_size
?