оптимизация пустого базового класса - PullRequest
5 голосов
/ 23 января 2011

Ниже приведен простой тест на ebco, я скомпилировал его как на vc9, так и на g ++. Выходы различаются на обоих компиляторах. Что я хочу знать, так это то, соответствует ли поведение vc.

#include <iostream>

class empty
{
};

class empty_one : public empty {};
class empty_two : public empty {};

class non_empty
    : public empty_one
    , public empty_two
{
};

int main()
{
    std::cout << "sizeof(empty): " << sizeof(empty) << std::endl;
    std::cout << "sizeof(empty_one): " << sizeof(empty_one) << std::endl;
    std::cout << "sizeof(empty_two): " << sizeof(empty_two) << std::endl;
    std::cout << "sizeof(non_empty): " << sizeof(non_empty) << std::endl;

    std::cout << std::endl;

    non_empty a[2];

    void* pe10 = static_cast<empty*>(static_cast<empty_one*>(&a[0]));
    void* pe20 = static_cast<empty*>(static_cast<empty_two*>(&a[0]));
    std::cout << "address of non_empty[0]: " << &a[0] << std::endl;
    std::cout << "address of empty of empty_one: " << pe10 << std::endl;
    std::cout << "address of empty of empty_two: " << pe20 << std::endl;

    std::cout << std::endl;

    void* pe11 = static_cast<empty*>(static_cast<empty_one*>(&a[1]));
    void* pe21 = static_cast<empty*>(static_cast<empty_two*>(&a[1]));
    std::cout << "address of non_empty[1]: " << &a[1] << std::endl;
    std::cout << "address of empty of empty_one: " << pe11 << std::endl;
    std::cout << "address of empty of empty_two: " << pe21 << std::endl;
}

Вкл.,

pe20 == pe11. (test1)

Могут ли два подобъекта двух объектов иметь один и тот же адрес? Это соответствует?

Кроме того,

pe20 >= &a[0] + sizeof(a[0]) (test2)

Может ли адрес подобъекта проходить через конец объекта?

На g ++ выше двух тестов не выполняется.

РЕДАКТИРОВАТЬ : в c ++ 0x стандартная версия, 1,8 / 6,

Если объект не является битовым полем или подобъектом базового класса нулевого размера, адрес этого объекта является адресом первого байта, который он занимает. Два разных объекта, которые не являются ни битовыми полями, ни подобъектами базового класса нулевого размера, должны иметь разные адреса

Стандарт требует, чтобы два объекта имели разные адреса, когда они не являются ни битовыми полями, ни подобъектами базового класса нулевого размера . Но это не требует, чтобы два подобъекта нулевого размера не могли иметь одинаковый адрес. Так test1 может быть правдой?

Ответы [ 2 ]

1 голос
/ 23 января 2011

pe10 == pe11.Могут ли два подобъекта двух объектов иметь один и тот же адрес?Является ли это совместимым?

Nopes!

Размер пустого класса не может быть нулевым, поскольку в этом случае два объекта одного класса будут иметь одинаковыеадрес, который невозможен.

Аналогично, два подобъекта двух разных объектов не могут иметь один и тот же адрес.Ваш компилятор не соответствует.Измени это!

1 голос
/ 23 января 2011

pe10 == pe11. Может два подобъекта два объекта имеют одинаковый адрес? Является это соответствует?

Нет, два разных объекта не могут иметь один и тот же адрес. Если это так, компилятор не является стандартной жалобой.

Кстати, какую версию VC ++ вы используете? Я использую MSVC ++ 2008, и его вывод таков:

alt text

Я думаю, вы имели в виду pe20==pe11? Если так, то это тоже неправильно, нестандартно. Компилятор MSVC ++ 2008 содержит ошибку!

GCC правильно; посмотрите вывод самостоятельно: http://www.ideone.com/Cf2Ov


Подобная тема:

Когда программисты используют Оптимизацию пустой базы (EBO)

...