c++空类的大小】的更多相关文章

初学者在学习面向对象的程序设计语言时,或多或少的都些疑问,我们写的代码与最终生编译成的代码却大相径庭,我们并不知道编译器在后台做了什么工作.这些都是由于我们仅停留在语言层的原因,所谓语言层就是教会我们一些基本的语法法则,但不会告诉我们为什么这么做?今天和大家谈的一点感悟就是我在学习编程过程中的一点经验,是编译器这方面的一个具体功能. 首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址. 那我们先看看一个例子: #include<iostream.h> class a {}…
转自:http://blog.sina.com.cn/s/blog_93b45b0f01015s95.html 我们经常会遇到这些问题: (1)C++中定义一个空类,他们它的大小(sizeof) 为多少? (2)只有一个char数据成员的类的大小? (3)能否定义一个空数组? (4)空数组名做标示的指针指向什么地方? (5)空类有什么用? (6)空数组有什么用? 等等 这些问题,笔者在这篇文章统统做一个比较详细的解析和认识. 1,sizeof是什么? 首先我们要理解sizeof是什么东西?准确来…
C++中类涉及到虚函数成员.静态成员.虚继承.多继承.空类等. 类,作为一种类型定义,是没有大小可言的. 类的大小,指的是类的对象所占的大小.因此,用sizeof对一个类型名操作,得到的是具有该类型实体的大小. 类大小的计算,遵循结构体的对齐原则: 类的大小,与普通数据成员有关,与成员函数和静态成员无关.即普通成员函数.静态成员函数.静态数据成员.静态常量数据成员,均对类的大小无影响: 虚函数对类的大小有影响,是因为虚函数表指针带来的影响: 虚继承对类的大小有影响,是因为虚基表指针带来的影响:…
第一:空类的大小 class CBase { }; 运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl; 输出 sizeof(CBase)=1: 为什么空的什么都没有是1呢? 先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址.同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了.所以空类的sizeof为1. 第…
转自: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++语言中的…
关于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…
class a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{}; 类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以a,b的大小为1. 而类c是由类a派生而…
代码: #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个字节.…
类的大小——sizeof 的研究(1) 先看一个空的类占多少空间? class Base { public: Base(); ~Base(); }; 注意到我这里显示声明了构造跟析构,但是sizeof(Base)的结果是1. 因为一个空类也要实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址.同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了.所以空类的sizeof为1. 而析构函数,跟构造函数这些成员函数,是跟s…
C++类的大小   一个空类class A{};的大小为什么是1,因为如果不是1,当定义这个类的对象数组时候A objects[5]; objects[0]和objects[1]就在同一个地址处,就无法区分. 单继承 #include<iostream> using namespace std; class A { public: virtual void aa(){} private: char k[3]; }; class B: public A { public: virtual voi…
(一)常规类大小计算 C++类对象计算需要考虑很多东西,如成员变量大小,内存对齐,是否有虚函数,是否有虚继承等.接下来,我将对此举例说明. 以下内存测试环境为Win7+VS2012,操作系统为32位 一.完全空类 #include <iostream> using namespace std; class A { }; class B : public A{ }; class C : public B{ }; int main() { A a; B b; C c; cout<<&q…
用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个字节,为实现内存对…
C++标准规定类的大小不为0,空类的大小为1,当类不包含虚函数和非静态数据成员时,其对象大小也为1. 如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态的关键.而虚函数本身和其他成员函数一样,是不占用对象的空间的. 为什么空类大小不是0? 因为,如果是0的话,可能出现两个变量的地址相同! 从以上的几个例子不难发现类的大小: 1.为类的非静态成员数据的…
今天刷题时看到一题,是求类的大小的,其中涉及了内存的一些知识,记录一下. 正确答案是12和9 首先是内存对齐原则,可以参考这篇博文:http://www.cppblog.com/snailcong/archive/2009/03/16/76705.html 关于求类的大小,这和类中的成员有很大关系,涉及到成员变量.成员函数等,总结如下: (1)类所占空间大小是由成员变量决定的(静态成员除外),普通成员函数是不算在内的: (2)空类(无任何成员)的大小为1: (3)类本身的虚函数占4个字节: (4…
一个空类class A{};的大小为什么是1,因为如果不是1,当定义这个类的对象数组时候A objects[5]; objects[0]和objects[1]就在同一个地址处,就无法区分. 单继承 #include<iostream> using namespace std; class A { public: virtual void aa(){} private: ]; }; class B: public A { public: virtual void bb(){} }; int ma…
在C++中空类会占一个字节,这是为了让对象的实例能够相互区别.具体来说,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址,因此,编译器会给空类隐含加上一个字节,这样空类实例化之后就会拥有独一无二的内存地址.如果没有这一个字节的占位,那么空类就无所谓实例化了,因为实例化的过程就是在内存中分配一块地址.    注意:当该空白类作为基类时,该类的大小就优化为0了,这就是所谓的空白基类最优化. class T { }; int main() { T t1, t2; cout<<sizeof…
先看如下代码: #include<iostream> using namespace std; class Base1 { public: }; class Base2 { public: char ch; }; class Base3 { public: int ch; }; class Base4 { public: char ch; int sh; }; int main() { cout << "sizeof(Base1)=" << size…
这篇文章包含哪些内容 这篇文章从一个Empty的MonoBehaviour入手,首先讨论一下C#的修饰符internal,default,virtual,sealed 接着讨论一下MonoBehaviour,Component,Tranform,GameObject之间的关系 及脚本之间的如何互相关联 从一个空类说起 using UnityEngine; using System.Collections; public class EmptyClass : MonoBehaviour { //…
昨天笔试遇到个 关于类占用的空间大小的问题,以前没怎么重视,回来做个试验,还真发现了问题,以后各位笔试考官门,出题时请注明是用什么编译器. vc6/vc8 cl 和 Dev-C 的g++ 来做的测试: 上代码, 测试代码: #include <stdio.h>class A{public: int x;  int y; A() {  x = 1;     y = 2; }; void go() {  printf("A go()\n"); }    virtual void…
定义一个空的C++类,例如 class Empty { } 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,一般编译过去就相当于 class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& ); // 赋值运算符 Empty* oper…
定义一个空类 class Empty { }; 默认会生成以下几个函数 2. 拷贝构造函数 Empty(const Empty& copy) { } 3. 赋值运算符 Empty& operator = (const Empty& copy) { } 4. 析构函数(非虚) ~Empty() { } 这些函数只有在第一次使用它们的时候才会生成,他们都是inline并且public的.如果想禁止生成这些函数,可以将它们定义成private函数,如果有很多类都有这种需求,那么可以定义一…
一.深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝:如果只是分配指针本身的内存,那就是浅拷贝.浅拷贝造成的问题是有两个指针指向同块内存,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…
C++的空类有哪些成员函数:. 缺省构造函数.. 缺省拷贝构造函数.. 缺省析构函数.. 缺省赋值运算符.. 缺省取址运算符.. 缺省取址运算符 const.     注意:有些书上只是简单的介绍了前四个函数(宝典4th p112).没有提及后面这两个函数.但后面这两个函数也是空类的默认函数(Ref:<effective c++>).另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们. //C++ 空类默认产生的类成员函数: //缺省构造函数,拷贝构造函数,析构函数,赋值运算…
转自http://www.tuicool.com/articles/uiUJry 一个空的class在内存中多少字节?如果加入一个成员函数后是多大?这个成员函数存储在内存中什么部分? 一个Class对象需要占用多大的内存空间.最权威的结论是:     *非静态成员变量总合.     *加上编译器为了CPU计算,作出的数据对齐处理.     *加上为了支持虚函数,产生的额外负担. 介绍完了理论知识后,再看看再找一个例子看看(注:一下所有结果都是在VC6.0 开发环境中得出的结论) 一.空类的Siz…
class Empty { public: Empty(); // 缺省构造函数 Empty( const Empty& ); // 拷贝构造函数 ~Empty(); // 析构函数 Empty& operator=( const Empty& ); // 赋值运算符 Empty* operator&(); // 取址运算符 const Empty* operator&() const; // 取址运算符 const }; 空类默认会产生6个函数. 空类的大小为1,…
1. 代码及问题 #include <iostream> using namespace std; class A { public: A() {} //A *p = new A()时:此时A须写成A() {} void hello() { std::cout << "hello" << std::endl; } }; int main() { A *p = new A(); p = NULL; p->hello(); //空类指针为什么可以调…
C++中的空类,编译器默认可以产生哪些成员函数 C++中创建一个空类:class Empty {};默认会生成4个函数,其函数的原型如下: public: Empty() { ... } Empty(const Empty& rhs) { ... } ~Empty() { ... } Empty& operator=(const Empty& rhs) { ... } 说明:1) 这些函数只有在需要调用的时候,编译器才会生成. 2) 4个函数都是public的. 3) 4个函数都是…
[为什么C++空类的实例大小为1] 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以大小为1. 参考:http://bbs.csdn.net/topics/370134485…