- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
下面是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;
}
在 vc 上,
pe20 == pe11. (test1)
两个对象的两个子对象可以有相同的地址吗?这符合吗?
此外,
pe20 >= &a[0] + sizeof(a[0]) (test2)
子对象的地址可以通过对象的末尾吗?
在 g++ 上,以上两个测试不成立。
编辑:在 c++0x 标准草案中,1.8/6,
Unless an object is a bit-field or a base class subobject of zero size, the address of that object is the address of the first byte it occupies. Two distinct objects that are neither bit-fields nor base class subobjects of zero size shall have distinct addresses
标准要求当两个对象既不是位域也不是零大小的基类子对象时,它们具有不同的地址。但它并不要求两个零大小的子对象不能有相同的地址。那么 test1 可以是真的吗?
最佳答案
pe10 == pe11. Can two sub-objects of two objects have the same address? Is this conformant?
不可以,两个不同的对象不能有相同的地址。如果有,则编译器不是标准投诉。
顺便问一下,您使用的是哪个版本的 VC++?我正在使用 MSVC++2008,它的输出是这样的:
我想,你的意思是 pe20==pe11
?如果是这样,那么这也是错误的,不规范的。 MSVC++2008编译器有bug!
海湾合作委员会是正确的;自己看输出:http://www.ideone.com/Cf2Ov
类似主题:
关于c++ - 空基类优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4772219/
仍在掌握 C++ 类的窍门,我想知道实现此目的的最高效的运行时方法是什么: 我有一个派生类,我想实例化一次(在编译时已知),但我想将指针类型转换为基类指针并将其传递给我的程序的其余部分使用。这样,如果
我是一名优秀的程序员,十分优秀!