Ниже приведен простой тест на 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 может быть правдой?