sizeof 空类】的更多相关文章

C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1. 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键.而虚函数本身和其他成员函数一样,是不占用对象的空间的. 为什么空类大小不是0? 因为,如果是0的话,可能出现两个变量的地址相同! 从以上的几个例子不难发现类的大小: 1.为类的非静态成员数据的…
用sizeof求类的大小,http://blog.csdn.net/szchtx/article/details/10254007(sizeof浅析(三)——求类的大小),这篇博文给出了非常详尽的举例介绍. 但是细心的话,你会发现一个小瑕疵,那就是对如下例子求sizeof(B),在VS下是16不是12! class A { public: int a; private: char b; }; class B : public A { public: int d; char c; }; 以下是我根…
1 分析下列程序: #include<iostream> using namespace std; struct s { int x: 3; int y: 4; int z: 5; double a; }; int main() { cout<<sizeof(s)<<endl; return 0; } 求sizeof(s)的结果为 16. 分析:看清楚结构体中是位操作,三个变量共占用一个int 类型的大小,int 类型占用4个字节,double占用8个字节,为实现内存对…
转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多少? (2)只有一个char数据成员的类的大小? (3)能否定义一个空数组? (4)空数组名做标示的指针指向什么地方? (5)空类有什么用? (6)空数组有什么用? 等等 这些问题,笔者在这篇文章统统做一个比较详细的解析和认识. 1,sizeof是什么? 首先我们要理解sizeof是什么东西?准确来…
今天面试遇到了一个很有意思的问题,即空结构体在C++中所占的内存大小是多少?参见如下代码: #include <iostream> struct S0 { }; int main() { std::cout << sizeof S0 << std::endl; ; } 面试官当场提醒了我一下,说如果S0对象所占用的内存大小为0,那么将可以申请无限多个此类型的对象数组,并且大小永远为0.我当时觉得有点道理,不过转念一想,还是有点疑惑. 回来研究了一下,原来在C++语言中的…
初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能. 首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址. 那我们先看看一个例子: #include<iostream.h> class a {}…
关于C++中空类的大小为1,我们大家都有所了解,但是除了空类之外的其他一些没有成员变量的类的大小,还是有很多不明之处的. 我们来看如下一个例子: #include<iostream> using namespace std; class a {}; class b{}; class c :public a{ virtual void fun() = 0; }; class d :public b, public c{}; int main() { cout << "siz…
代码: #include <iostream> using namespace std; struct A{ }; struct B{ int i; }; class C:B{ ; }; int main(){ cout<<sizeof(A)<<endl; cout<<sizeof(B)<<endl; cout<<sizeof(C)<<endl; ; } 输出: 1 4 16 分析: 空类的大小为1,纯虚函数占8个字节.…
对虚继承层次的对象的内存布局,在不同编译器实现有所区别. 首先,说说GCC的编译器. 它实现比较简单,不管是否虚继承,GCC都是将虚表指针在整个继承关系中共享的,不共享的是指向虚基类的指针. class A { int a; virtual ~A(){} }; class B:virtual public A{ virtual void myfunB(){} }; class C:virtual public A{ virtual void myfunC(){} }; class D:publi…
一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝:如果只是分配指针本身的内存,那就是浅拷贝.浅拷贝造成的问题是有两个指针指向同块内存,delete 其中一个指针,那么剩下的指针将成为野指针.编译器合成的默认拷贝构造函数和赋值运算符是浅拷贝的,如果只是普通成员的赋值,浅拷贝也是可以的.  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23   #i…