您的位置:首页 > 编程语言 > C语言/C++

C++类与对象(3) - 空class&struct的大小

2015-05-24 08:12 337 查看
C++中,不论是空类,还是空结构体,其大小都是为1.1.一个空类的大小不是0,通常为1。参考下面例子1:
#include<iostream>

class Empty {};

int main()
{
std::cout << "sizeof(Empty) = "<<sizeof(Empty);
return 0;
}
输出结果:sizeof(Empty) = 1
2.空类大小为1,这样可以确保两个不同的对象,拥有不同的地址。参考下面这个例子2,可以看到两个对象的地址是不同的。
#include<iostream>class Empty { };int main(){Empty a, b;if (&a == &b)std::cout << "address equal, impossible!" << std::endl;elsestd::cout << "address not equal, excepted!" << std::endl;return 0;}
输出:address not equal, excepted!3. 同样的原因 (不同对象拥有不同地址), new对象后,也会返回不同的指针。如下面例子3所示:
#include<iostream>class Empty{};int main(){Empty* p1 = new Empty;Empty* p2 = new Empty;if (p1 == p2)std::cout << "address equal, impossible!" << std::endl;elsestd::cout << "address not equal, excepted!" << std::endl;return 0;}
输出:address not equal, excepted!4. 空基类的大小参考下面程序,其中基类是一个空类。
#include<iostream>class Empty { };class Derived: Empty { int a; };int main(){std::cout << "sizeof(Derived) = " << sizeof(Derived);return 0;}
输出(使用gcc编译):sizeof(Derived) = 4注意,输出值并没有预想中的那样会大于4!而是等于4!这是一条很有趣的规则,即空的基类可以不依靠一个字节来表示。这样编译器碰到空的基类情况时,可以自由的进行优化。5. 各情况下的类大小
#include <iostream>using namespace std;class Empty {};class Derived1 : public Empty {};class Derived2 : virtual public Empty {};class Derived3 : public Empty{char c;};class Derived4 : virtual public Empty{char c;};class Dummy{char c;};int main(){cout << "sizeof(Empty) " << sizeof(Empty) << endl;cout << "sizeof(Derived1) " << sizeof(Derived1) << endl;cout << "sizeof(Derived2) " << sizeof(Derived2) << endl;cout << "sizeof(Derived3) " << sizeof(Derived3) << endl;cout << "sizeof(Derived4) " << sizeof(Derived4) << endl;cout << "sizeof(Dummy) " << sizeof(Dummy) << endl;return 0;}
输出:sizeof(Empty) 1sizeof(Derived1) 1sizeof(Derived2) 4sizeof(Derived3) 1sizeof(Derived4) 8 //这个case包括了内存对齐sizeof(Dummy) 1更多的参考:http://www2.research.att.com/~bs/bs_faq2.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: