Практические варианты использования ключевых слов C ++ alignof и alignas - PullRequest
3 голосов
/ 20 июня 2020

Я только что узнал о ключевых словах C ++ alignof и alignas, но не могу придумать ни одного практического случая, когда разработчик захотел бы использовать эти ключевые слова.

Кто-нибудь знает какой-нибудь практический вариант использования для эти ключевые слова?

Ответы [ 3 ]

4 голосов
/ 20 июня 2020

Обычный вариант использования спецификатора 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, они, очевидно, будут конкурировать за одну и ту же строку кеша).

2 голосов
/ 20 июня 2020

Практические варианты использования из моего опыта:

  • написание специализированного распределителя для сетевых пакетов во встроенной системе
  • работа с ошибками в специализированном процессоре встроенной системы
  • производительность оптимизация использования кеша
  • предоставление части объекта C ++ в C библиотеку, которая ожидает конкретного выравнивания
0 голосов
/ 28 июля 2020

Резервная память для указателей : если указатели на тип всегда заканчиваются нулями из-за выравнивания этого типа, то эти всегда нулевые биты можно использовать для хранения чего-то еще. Пример:

class Small { Aligned * ptr; bool b; }; // suppose having many instances

займет не менее 8 + 1 байт на 64-битной архитектуре, но его можно сжать до 8 байтов, тщательно объединив ptr и bool. Перед использованием ptr вы должны замаскировать его, но это очень быстрая инструкция. Это компромисс между памятью и процессором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...