Привет
Решил по взрослому собрать с /Wall /WX
Вылазит варнинг:
warning C4820: 'MyClass': '4' bytes padding added after data member 'MyClass::{vbptr}'
Это практически все мои классы. Что-то дописывать вокруг каждого класса — неохота. Глобально отключать этот варнинг — не хочется — он же выдается и тогда, когда речь идёт не о {vbptr}, а о обычных членах класса, это пусть пока будет.
Как быть?
Здравствуйте, пффф, Вы писали:
П>Как быть?
отключить этот ворнинг по всему проекту.
Или смотреть каждый класс отдельно. Скорее всего у вас компилятор добавляет лишние байты для выравнивания
Н-р:
struct MyStruct {
char tag[4];
MyStruct* ptr;
};
При выравнивании по 8 байт между tag и ptr влезут лишние 4 байта. Наверное вы этого не хотели и были бы не против поменять порядок полей в классе для минимизации размера.
Здравствуйте, 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
{}
};
Вот на всё это тоже варнинги о выравнивании выдаёт
Здравствуйте, пффф, Вы писали:
П>Вылазит варнинг:
П>П>warning C4820: 'MyClass': '4' bytes padding added after data member 'MyClass::{vbptr}'
П>
П>Это практически все мои классы. Что-то дописывать вокруг каждого класса — неохота. Глобально отключать этот варнинг — не хочется — он же выдается и тогда, когда речь идёт не о {vbptr}, а о обычных членах класса, это пусть пока будет.
П>Как быть?
Или отключите выравнивание #pragma pack(1) , __declspec(align(1))
или предупреждение C4820
или вручную всё выравнивайте.