Clang-аккуратное предложение выравнивания с помощью `altera-struct-pack-align`

Я экспериментирую с 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)));
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
781
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассуждение

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

последствия

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

Другие вопросы по теме