Выравнивание данных и размер структур
От: DiZSl  
Дата: 24.11.19 11:05
Оценка:
Доброго времени суток,

На днях начал разбивать проект на отдельные либы и понял, что не хватает знаний по тому как компилятор выравнивает данные и выделяет память

Допустим у нас есть класс

class CTest
{
private:
int a;
char b;
int c;
};

если я сделаю new CTest() в основном проекте, то как компилятор узнает с каким варавниванием была откомпилирована либа? Ведь выравнивание данных в либе может не совпадать с выравниванием в основном проекте. Тогда может выделиться памяти меньше чем нужно (с разным выравниванием sizeof возвращает 9, 10, 12 байт).
Конечно я могу new CTest() перенести в либу, но проблему это решит только для выделяющихся динамически объектов.

class CTest2
{
public:
CTest2()
{
d=0;
}
private:
CTest2 Test2ж
int d;
};

В дданном примере, если CTest была скомпилирована с выравниванием по 16 байт, а основной проект без выравнивания, то при инициализации d произойдет перезатирание свойств CTest и наоборот

Сейчас поставил #pragma pack для подстраховки.
Но как правильно эта проблема решается?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.