На днях начал разбивать проект на отдельные либы и понял, что не хватает знаний по тому как компилятор выравнивает данные и выделяет память
Допустим у нас есть класс
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 для подстраховки.
Но как правильно эта проблема решается?