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) = 12.空类大小为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
相关文章推荐
- 关于 Union,Struct and Class的大小计算问题的思考(转)&union和struct类型的大小计算(转)
- struct&&class 空的大小
- C/C++日常学习总结(第二篇)结构体和类的大小及区别&为什么是new一个对象而不是malloc
- C++类的实例化对象的大小之sizeof()
- TVSKIN源代码阅读日记(五)--- CFONT CLASS (MFC LIB) &amp; LOGFONT STRUCT(GDI)
- C++类的大小——sizeof(class)
- [置顶] 从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector .
- C#,struct,class,使用BinaryFormatter将对象序列化
- struct&& class
- 无法解析的外部符号 "public: virtual struct CRuntimeClass
- C++类对象大小的计算(二)含有虚函数类大小计算
- illegal use of incomplete struct/union/class 'CAknViewAppUi'
- C++中struct 和 class的sizeof大小
- [C/C++]函数如何返回struct或class对象
- C++类对象的大小
- 解决上传文件大小受限制 [Request 对象 错误 'ASP 0104 : 80004005'
- 结构体内存大小的求法(内存对齐)&&c++类大小同样适用
- C++类的大小——sizeof(class)
- c++ error: reference to 'plus' is ambiguous ; template<class _Tp> struct std::plus
- C\C++ struct && class 综述