Объектная модель G ++

0

Сегодня я прочитал <>. Я столкнулся с проблемой. Как говорится в книге,

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? Может кто-нибудь мне помочь?

Теги:
object-model

1 ответ

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 по сравнению с не-под. Компилятор имеет больше гибкости в макете данных класса для не-подтипов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню