#c #alignas
#c #выравнивание
Вопрос:
Можно ли использовать параметры шаблона C для управления спецификаторами в самом классе, чтобы минимизировать некоторое дублирование кода?
Например: у меня есть класс, который я хотел бы использовать как в параллельном контексте (и контейнере) со alignas
спецификатором, так и в однопоточном контексте без alignas
спецификатора. Размер класса невелик (20B) — меньше строки кэша. Мне действительно нужно копировать между двумя классами. Прямо сейчас я продублировал код для двух определений двух классов, которые в основном совпадают, кроме указанного спецификатора. Могут ли шаблоны или иным образом разрешать одно определение, одно с alignas
и одно без?
Комментарии:
1. Почему требуется параллельный контекст
alignas
?2. Будете ли вы использовать класс со
alignas
спецификатором и без него в одном проекте?3. Вы говорите, что вам нужно иметь возможность копировать между двумя версиями класса. Но имейте в виду, что шаблоны не являются наследованием. Таким образом, они рассматриваются как совершенно другой класс после фактического запуска компиляции.
4. @Eugene для предотвращения совместного использования ложных данных в ситуации производитель-потребитель
5. @NathanOliver да
Ответ №1:
Вы можете сделать это следующим образом:
template <size_t alignment = 0>
class alignas(alignment) C {
// ...
};
Теперь C<>
для его определения будет использоваться выравнивание по умолчанию (поскольку alignas(0)
игнорируется), в то время как вы могли бы использовать, например C<16>
, для принудительного выравнивания 16.