`

类大小sizeof(class)

 
阅读更多

class如同int等内建类型一样,分配有一定大小的内存,本文通过基本类、含有虚函数的类、单继承的派生类和多重继承的派生类来考察类的内存布局规律。

1、普通类对象的大小

sizeof(struct C000)本应该是0,但有一个占位符;

普通成员函数,静态成员函数,及静态成员变量皆不会在类的对象中有所表示。其中普通成员函数是在编译期通过this指针与类关联的,静态成员函数和静态成员变量相当于全局变量,只不过比其多一个类名称的限定。

2、普通派生类对象的大小

可以理解为全盘继承下来,而不用管是否重名以及继承方式,两个父类有重名的成员,则在向上调用父类成员时就会产生向上二义性。

3、带虚函数类对象的大小

带虚函数的类不同于普通类的是有一个虚函数表指针,也就是一个指针数组,而sizeof(*)为4.单继承派生类与基类共用一个虚函数表,但表的条目可能不一样,可能派生类虚函数表的条目多一些,或者是进行了改写。

4、带虚函数多重派生类对象大小

含虚函数类多继承派生类拥有多个虚函数表,派生类可以重写各个基类的虚函数,从而修改了虚函数表,也可以添加虚函数,这个添加的虚函数指针条目将添加到第一个虚函数表中。

created by braveyly

2010-05-01 22:26:09

参考资料:C++对象布局及多态实现的探索(一)(二)(三)

http://www.devxx.com/2009/06/138.html

分享到:
评论

相关推荐

    C#中sizeof的用法实例分析

    在C#中,sizeof用来计算类型的大小,单位是字节。有这样的一个类: public class MyUglyClass { public char myChar1; public int myInt; public char myChar2; } 在客户端,试图使用sizeof计算该类型的大小。 ...

    C++ sizeof 实例解析

    在C++中使用sizeof要比C复杂很多,因为C++类中有static静态变量,virtual虚函数,还有继承、派生等。sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其...

    C++11新特性之Class

     新标准中,sizeof可以直接用于获取Class::member的大小,而不用通过Class的实例。 class TestClass { public: int member_i; char member_c; }; cout<<"test sizeof class member: "; cout<<...

    sizeof4j:Java 的 sizeof

    class Main { public static void main ( String [] args ) { ConsoleUtil . printJvmDetails(); out . println( " \n\n SizeOf " ); out . println( " ================================= " ); out . println...

    C++空类及没有成员变量的类的大小实例分析

    众所周知的C++中空类的大小为1,但是除了空类之外的其他一些没有成员变量的类的大小,还是有相当一部分开发人员对此有很多不明之处的。 这里我们以如下代码为例: #include using namespace std; class a {}; class...

    c++ 面试题 总结

    private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的空间里有父类的所有变量(static除外) 同一个函数只存在一个实体(inline除外) 子类覆盖它的函数不加virtual ,也能实现多态。 在子类的...

    深入分析C++中类的大小

     class A{}; class B { int b; char c; }; class C { int c1; static int c2; }; int C::c2 = 1; class D:public C,public B{ int d; }; int main() { cout<<“sizeof(A)=”<<sizeof(A...

    学生成绩管理系统C++

    class student { studentnode * head; public: student(); int addstudent(); ~student(); int countmark(); int sortbymark(); int save(); int show(); int display(); int readfiletolist(); int ...

    C/C++中获取数组长度的方法示例

    学过C/C++的人都知道,在C/C++中并没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取其长度,那么对于其他类型的数组如何获取他们的长度呢?...template <class> int getArrayLe

    project-treemap:用于IntelliJ的项目树形图微插件(使用d3.js进行可视化)

    (包名称下面的数字显示了它包含的所有类的估计大小;请参阅下面的类大小定义。) “ platform-impl”源根目录下“ com.intellij”包的树状图视图。 为什么? 因为正常的树状结构无法显示彼此之间有多大关系 类...

    Wininet API 写的下载器类,可获取文件名,下载,等等。

    class CHttpGet { public: //测试网络是否连接成功。 BOOL TestNetworkIsConnected(); //动态获取URL的文件名。 //LPCTSTR szURL URL地址 //LPSTR pFileName 文件名缓冲区,获取到文件名后,会文件名放入到该...

    语言程序设计课后习题答案

    而且由于编译时忽略注释部分,所以注释内容不会增加最终产生的可执行程序的大小。适当地使用注释,能够提高程序的可读性。在C++中,有两种给出注释的方法:一种是延用C语言方法,使用"/*"和"*/"括起注释文字。另一种...

    【Android自定义控件】自适应文字大小的TextView

    public class PZHelp_TextView_AutoTextSize extends androidx.appcompat.widget.AppCompatTextView { //控件的宽 private int mViewWidth, mViewHeight; //计算出的文字大小 private float sizeOfWidth, sizeOf

    MFC串口通信

    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // ...

    c/c++ 学习总结 初学者必备

    从功能定义上,strlen函数,用来求字符串的长度,sizeof函数是用来求指定变量或变量类型等所占用内存的 大小; 2.sizeof是运算符,而strlen是C库函数strlen只能用char*做参数,且以'\0'结尾的; 对于静态数组处理: ...

    C# for CSDN 乱七八糟的看不懂

    引用类型包括类 (Class)类 型、接口类型、委托类型和数组类型。 变量的类型声明 变量的类型声明 每个变量必须预先声明其类型。如 int a; int b = 100; float j = 4.5; string s1; 用 object 可以表示所有的类型。 ...

    CheckMem.pas

    Move(ObjList[I + 1], ObjList[I], (FreeInList - I) * SizeOf(Pointer)); Exit; end; end; procedure SnapCurrMemStatToFile(Filename: string); const FIELD_WIDTH = 20; var OutFile: TextFile; I...

Global site tag (gtag.js) - Google Analytics