Сегодня я прочитал <>. Я столкнулся с проблемой. Как говорится в книге,
class Concrete1 {
public:
int val;
char bit1;
};
class Concrete2 : public Concrete1 {
public:
char bit2;
};
class Concrete3 : public Concrete2 {
public:
char bit3;
};
когда я запускаю код в mingw g++, пространство трех классов равно 8, 12, 12. Но когда я запускаю код в vs2012, пространство трех классов - это 8, 12, 16. of cource, код в vs2012 без проблем. Но для пространства в g++ у меня есть некоторые вопросы, и я пытаюсь написать пример кода, чтобы узнать, есть ли проблема. пример кода следующим образом:
int main(void)
{
Concrete2 con2;
memset(&con2, 0, sizeof(con2));
Concrete3 con3;
con3.val = 3;
con3.bit2 = 4;
con3.bit3 = 5;
Concrete2* con_ptr2 = &con2;
Concrete2* con_ptr3 = &con3;
*con_ptr3 = *con_ptr2;
cout << con3.bit3<< endl;
cout << sizeof(Concrete1) << endl;
cout << sizeof(Concrete2) << endl;
cout << sizeof(Concrete3) << endl;
return 0;
}
и для объектной модели в g++ код без проблем. После кода "* con_ptr3 = * con_ptr2;", con3.bit3 равен 5 не 0? Может кто-нибудь мне помочь?
Кажется, что результат правильный, бит3 должен быть 5, потому что это присвоение влияет только на части Concrete1 и Concrete2 con3.
Назначение является членом, а не байт. Таким образом, "* com_ptr3 = * con_ptr2" не совпадает с "memcpy (con_ptr3, con_ptr2, sizeof (Concrete2))". Конструктор копирования по умолчанию и операторы присваивания по умолчанию должны копировать данные по-члену и в том порядке, в котором члены определены в класс. Это также означает, что вы не можете рассчитывать на байты заполнения, имеющие какое-либо конкретное значение.
Различия в размерах объясняются только тем, что элементы управления VS и gcc немного отличаются друг от друга. gcc, по-видимому, способен упаковать бит2 и бит3 в одно и то же 32-битное слово, а VS - нет. Странно, что gcc также не может упаковать бит1, что приводит к размерам 8,8,8.
Это может быть связано с тем, что gcc считает, что Concrete1 является POD, но Concrete 2 и 3 - нет. Стандарт предъявляет более строгие требования к тому, как данные изложены в типах POD по сравнению с не-под. Компилятор имеет больше гибкости в макете данных класса для не-подтипов.