Я экспериментирую с clang-tidy (при использовании gcc) со всеми его проверками. Мне было любопытно, является ли приведенный ниже случай ошибкой clang-tidy, поскольку это противоречит предупреждениям моего компилятора. Вот минимальный пример:
struct a{
virtual void func()=0;
virtual void func2()=0;
};
struct b:a{
void func() override {};
void func2() override {};
private:
int x{};
}
int main(){
b b_item;
}
Предложение:
/home/main.cpp:7:8: note: use "__attribute__((aligned(0)))" to align struct 'a' to 0 bytes
struct a{
^
/home/main.cpp:13:8: warning: accessing fields in struct 'b' is inefficient due to padding; only needs 4 bytes but is using 16 bytes [altera-struct-pack-align]
struct b:a{
^
Я не буду демонстрировать код после предложения, так как clang-tidy внес много изменений, важным является следующее:
struct a{
virtual void func()=0;
virtual void func2()=0;
} __attribute__((aligned(0)));
предупреждение после вызова исправления:
warning: requested alignment ‘0’ is not a positive power of 2 [-Wattributes]
12 | } __attribute__((aligned(0)));





Ведь причина тому довольно проста. Варианты clang-tidy связаны с программированием fpga на C с учетом некоторых очень специфических компиляторов (я думаю, что altera использует c2h , а также есть большой список альтернатив здесь ). Эти компиляторы, вероятно, не имеют такого весьма расширенного предупреждения, но я еще не проверял это. Причина, по которой я считаю, заключается в том, что c lang не имеет виртуальных функций, поэтому я не могу придумать случай, когда выравнивание по нулевому байту было бы уместно ( C не допускает тривиальных структур).
У меня возник вопрос, почему gcc выдает это предупреждение? Уместно ли иметь структуру с нулевым байтом в С++?
Ответ: нет чисто виртуальных и абстрактных классов, которые никогда не компилируются, они используются только как базовые классы для других. Такие структуры, как altera* в моем вопросе, никогда не появляются в сборке. Итак, в заключение я считаю, что и gcc, и clang-tidy верны в своих предупреждениях, но я настоятельно рекомендую кому-то не использовать специальные флаги clang-tidy fpga в проектах, отличных от fpga.Здесь и здесь некоторые рассуждения на стороне gcc о введении этих предупреждений.