class字节计算
来源:互联网 发布:乐百视网络机顶盒 编辑:程序博客网 时间:2024/05/02 00:04
1、类的大小
类的sizeof()大小一般是类中的所有成员的sizeof()大小之和,这个就不用多说。确切的说,用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。注意:类只是一个类型定义,它本身是没有大小可言的。
对象大小= vptr(类中定义了多个virtual函数,仍然为占用4个字节) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器)。
2、使用sizeof()计算类大小的一些基本原则:
(1)类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑;
(2)类的字节大小也遵守类似struct字节对齐的,调整规则;(参考5分钟搞定内存字节对齐)
(3)成员函数都是不会被计算的;
(4)如果是子类,那么父类中的成员也会被计算,因为构造函数先初始化父类,所以在计算字节对齐时,先计算父类的字节,按父类定义的数据成员的最宽字节数来为子类进行字节对齐,类似struct;
(5)虚函数由于要维护虚函数表,所以要占据一个指针大小,也就是4字节。
总结即:一个类中,虚函数、成员函数(包括静态与非静态)和静态数据成员都不占用类对象的存储空间。
pragma pack(n),为n字节对齐方式
使用规则如下:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
测试代码如下:
#include<iostream> using namespace std;//1、空类 class empty_class{};class empty_class1{public: empty_class1(); ~empty_class1();};//2、虚函数 class virtual_class{public: virtual_class(); virtual ~virtual_class();};class example1_class{private: char a; double b;};class example2_class{public: example2_class(); virtual ~example2_class(); //若去掉virtual关键字,则sizeof(example2_class)结果为4 int count(int num){ a = num; } //普通成员函数,为各实例公有,不归入sizeof统计 private: double a;};class example3_class{public: example3_class(); ~example3_class(); //若去掉virtual关键字,则sizeof(example2_class)结果为4 virtual int count(int num){ a = num; } //虚函数不记入sizeof统计 virtual void cc(){ int c = 0; }private: int a;};class example4_class{public: virtual int count(int num){} //<span style = "font-family: Arial;"> < / span> //虚函数记入sizeof统计 private: int a;};class example5_class{private: float a; //double b; //int c; public: void fun(void);//不记入sizeof统计 };class example6_class //该类里面包含一个函数和一个虚函数,取最大的占用4个字节 { void func_1() {} void func_2() {} virtual void func_3() {} virtual void func_4() {}};//3、继承 class inherit_class :public example2_class{public: inherit_class(); ~inherit_class();private: char ch; char *pch; const float f; static double d; //不计入sizeof计算 };int main(){ cout << "sizeof(empty_class) = " << sizeof(empty_class) << endl; cout << "sizeof(empty_class) = " << sizeof(empty_class1) << " with constructer and deconstructer" << endl; cout << "sizeof(virtual_class) = " << sizeof(virtual_class) << " with virtual" << endl; cout << "sizeof(example1_class) = " << sizeof(example1_class) << endl; cout << "sizeof(example2_class) = " << sizeof(example2_class) << endl; cout << "sizeof(example3_class) = " << sizeof(example3_class) << endl; cout << "sizeof(example4_class) = " << sizeof(example4_class) << endl; cout << "sizeof(example5_class) = " << sizeof(example5_class) << endl; cout << "sizeof(example6_class) = " << sizeof(example6_class) << endl; cout << "sizeof(inherit_class) = " << sizeof(inherit_class) << " with inherit" << endl; system("pause"); return 0;}
输出如下:
- class字节计算
- c/c++中使用sizeof计算结构体struct和类class的长度(字节)
- class存储空间,字节对齐
- 计算字节大小函数
- java 计算字节长度
- 计算字节的长度
- 计算计算机字节顺序
- 字节对齐的计算
- 计算字节数
- struct字节计算
- 计算字节长度
- js计算字节长度
- Class字节码内容学习
- class字节码内容顺序
- class字节码类结构
- struct、class占用字节数
- sizeof struct class 字节对齐
- Class的字节码文件
- PriorityQueue剖析
- 用户登录小程序
- 适配器模式(转)
- The SetStack Computer(stack) -uva 12096
- pentaho Report Designer 入门教程(三)
- class字节计算
- mybatis, mapper.xml常用配置
- 【Linux开发】Linux V4L2驱动架构解析与开发导引
- Floyd判圈算法
- 【J2SE】——初见Java
- 六大设计原则之里氏替换原则
- com/android/dx/command/Main : Unsupported major.minor version 52.0
- 深入浅出谈java修饰符
- Android Studio怎么删除module