Ниже приведен простой тест на 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 может быть правдой?
Я думаю, что вы можете смело привести его в команду MSVC (если только это уже не так). –