Обычный вариант использования спецификатора alignas
- это сценарий, в котором вы хотите передать несколько объектов между разными потоками через очередь (например, очередь событий или задач), избегая при этом ложного совместного использования . Ложное совместное использование будет результатом того, что несколько потоков будут конкурировать за одну строку кэша , когда они фактически обращаются к разным объектам. Обычно это нежелательно из-за снижения производительности.
Например, если размер строки кэша равен 64 байтов - с учетом следующего класса Event
:
struct Event {
int event_type_;
};
Выравнивание Event
будет соответствовать выравниванию его элемента данных event_type_
. Предполагая, что выравнивание int
составляет 4 байт (т. Е. alignof(int)
оценивается как 4 ), тогда может поместиться до 16 Event
объектов. в одну строку кэша. Итак, если у вас есть такая очередь, как:
std::queue<Event> eventQueue;
, где один поток помещает события в конец очереди, а другой поток извлекает события спереди, у нас могут быть оба потока, конкурирующие за одну и ту же строку кеша. . Однако при правильном использовании спецификатора alignas
в Event
:
struct alignas(64) Event {
int event_type_;
};
Таким образом, объект Event
всегда будет выровнен по границе строки кэша, так что строка кеша будет содержать Event
объект максимум. Следовательно, два или более потока никогда не будут конкурировать за одну и ту же строку кэша при доступе к отдельным объектам Event
(если несколько потоков обращаются к одному и тому же объекту Event
, они, очевидно, будут конкурировать за одну и ту же строку кеша).