MSVC: Warning: padding added
От: пффф  
Дата: 20.07.23 18:10
Оценка:
Привет

Решил по взрослому собрать с /Wall /WX

Вылазит варнинг:

warning C4820: 'MyClass': '4' bytes padding added after data member 'MyClass::{vbptr}'


Это практически все мои классы. Что-то дописывать вокруг каждого класса — неохота. Глобально отключать этот варнинг — не хочется — он же выдается и тогда, когда речь идёт не о {vbptr}, а о обычных членах класса, это пусть пока будет.

Как быть?
Re: MSVC: Warning: padding added
От: sergii.p  
Дата: 20.07.23 18:37
Оценка: +1
Здравствуйте, пффф, Вы писали:

П>Как быть?


отключить этот ворнинг по всему проекту.
Или смотреть каждый класс отдельно. Скорее всего у вас компилятор добавляет лишние байты для выравнивания
Н-р:
struct MyStruct {
    char tag[4];
    MyStruct* ptr;
};

При выравнивании по 8 байт между tag и ptr влезут лишние 4 байта. Наверное вы этого не хотели и были бы не против поменять порядок полей в классе для минимизации размера.
Re[2]: MSVC: Warning: padding added
От: пффф  
Дата: 20.07.23 19:28
Оценка:
Здравствуйте, sergii.p, Вы писали:

П>>Как быть?


SP>отключить этот ворнинг по всему проекту.


Этого делать бы не хотелось.


SP>Или смотреть каждый класс отдельно. Скорее всего у вас компилятор добавляет лишние байты для выравнивания


Ну, как бы да, я об этом догадался из сообщения компилятора


SP>Н-р:

SP>
SP>struct MyStruct {
SP>    char tag[4];
SP>    MyStruct* ptr;
SP>};
SP>

SP>При выравнивании по 8 байт между tag и ptr влезут лишние 4 байта. Наверное вы этого не хотели и были бы не против поменять порядок полей в классе для минимизации размера.

Это да, но у меня есть классы вообще без мемберов, но с виртуальными функциями

Об этом и было сообщение в стартовом посте:

П>

П>warning C4820: 'MyClass': '4' bytes padding added after data member 'MyClass::{vbptr}' 
П>


Типа такого:
struct MyInteface
{
    virtual void method() = 0;
    virtual ~MyInteface() {}
};

struct MyIntefaceImpl : public MyInteface
{
    virtual void method() override
    {}
};


Вот на всё это тоже варнинги о выравнивании выдаёт
Отредактировано 20.07.2023 19:37 пффф . Предыдущая версия .
Re: MSVC: Warning: padding added
От: kov_serg Россия  
Дата: 20.07.23 19:46
Оценка:
Здравствуйте, пффф, Вы писали:

П>Вылазит варнинг:


П>
П>warning C4820: 'MyClass': '4' bytes padding added after data member 'MyClass::{vbptr}' 
П>


П>Это практически все мои классы. Что-то дописывать вокруг каждого класса — неохота. Глобально отключать этот варнинг — не хочется — он же выдается и тогда, когда речь идёт не о {vbptr}, а о обычных членах класса, это пусть пока будет.


П>Как быть?

Или отключите выравнивание #pragma pack(1) , __declspec(align(1))
или предупреждение C4820
или вручную всё выравнивайте.
Re[2]: MSVC: Warning: padding added
От: пффф  
Дата: 20.07.23 21:21
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>или предупреждение C4820


А как отключить из командной строки?

UPD Нашел. /wdXXXX;YYYY;...
Отредактировано 20.07.2023 21:32 пффф . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.