sizeof()是c++的运算符,返回变量或者类型占用的字节数。如sizeof(int) 为4,sizeof(char) 为1。

那么类大小呢,如

1 class A {
2   char a;
3   short b;
4   int c;
5 }

那么sizeof(A)为多少,结果是8。char占用一字节,b占用2字节,int占用4字节,A为什么是8字节。这就涉及到c++字节对齐问题,如int类型的地址是4的倍数,short类型的地址是2的倍数。包含int的对象的指针也是4的倍数。所以如果A的指针为pa(pa应该是4的倍数),c的指针应该是pa+4,或者pa+8,或者...,取决于c之前声明的变量的大小。同理,a的指针为pa,b的指针为pa+2,中间填充了一个字节,c的指针为pa+4,最终A占用8字节。

class B {char a,int c;short b;
}

sizeof(B)为什么,结果是12,原理同上,只不过c的指针为pa+4,b的指针为pa+8,而B的大小必须是类中最大的变量的倍数,所以sizeof(B) 为12

class C {int c;short b;char a
}

sizeof(C)为8,原理同上。

说完这个,再来看看函数会不会影响类的大小,如

class D {
public:D() {}~D() {}void Show() {std::cout << "Show()" << std::endl;}
}

sizeof(D)结果为1,空类的大小也是1,说明non-virtual函数不占用类的大小,事实上,函数是编译在其他地方的,你可以用空指针来访问函数,如

D *pd = NULL;
pd->Show();

前提是Show()里面没有访问类的变量,因为调用类成员函数时,会将类指针this传给成员函数,而我们传过去的是NULL,所以如果Show()里面调用类成员变量就会出错。

non-virtual不占用类的大小,但是virtual函数需要占用,如把D的析构函数改成virtual的,即

class D {
public:D() {}virtual ~D() {}void Show() {std::cout << "Show()" << std::endl;}
}

sizeof(D)在32位机子上结果为4,在www.compileonline.com上结果为8。这涉及到虚函数原理——虚函数表

一个类如果拥有虚函数,就会拥有一个虚函数表,但这个表并不保存在类中,类中保存的是一个指针,该指针指向需函数表的第一个位置,该位置是一个函数指针。

class E {
public:E() {}virtual ~E() {}virtual void Show() {std::cout << "Show()" << std::endl;}
}

sizeof(E)结果同样是4,因为虚函数表并没有保存在类中,类中保存的指向虚函数表的指针,当然,虚函数表变大了。

可以通过虚函数表调用函数

class F {
public:F() {}void virtual f() {std::cout << "f()" << std::endl;}virtual void  g() {std::cout << "g()" <<std::endl;}void h() {std::cout << "h()" << std::endl;}virtual ~F()  {}
};

可以这么调用

typedef void(* Fun)();
Fun pfunf=(Fun)*(int *)*((int *)&f);
Fun pfung=(Fun)*(int *)(*((int*)&f)+1)
pfunf() // f()
pfung() //g()

虚函数表用来实现多态,每一对象保存这自己的虚函数表,调用虚函数时查看虚函数表,跟调用non-virtual函数是不同的。

转载于:https://www.cnblogs.com/clark-lee/p/3892684.html

c++ 类的sizeof相关推荐

  1. 类的sizeof大小和C语言中各种数据类型的长度

    类的sizeof大小一般是类中的所有成员的sizeof大小之和,这个就不用多说. 不过有两点需要注意:1)当类中含有虚成员函数的时候,例如: class B { float a; public: vi ...

  2. 【转】求一个类的sizeof应考虑的问题

    源地址 昨天面试,面试官让我说一说求一个类的sizeof应该考虑的问题,心想,太好了,之前sizeof可是做了不少功夫,就说了类的非静态.非全局成员,如果有虚函数就要加上一个指向虚表的指针,4字节大小 ...

  3. 空类的sizeof为1

    程序: #include "iostream" #include "cstdlib" using namespace std;class A /* 空类 */ ...

  4. 带虚函数的类的sizeof分析

    一个类中若有虚函数,(不论是自己的虚函数,还是继承而来的),那么类中就有一个成员变量:虚函数指针.虚函数指针占4字节 直接看例子: class base1{ private:int a; public ...

  5. 【转】C++类的sizeof大小

    转自https://blog.csdn.net/zhengjihao/article/details/77825269 其中有的描述与实际GCC上执行的结果不符,不过其中的分析思路需要掌握. 以下是G ...

  6. c++中包含empty virtual base class 类的sizeof结果分析

    背景 类的继承关系如下 class Base{}; class First:public virtual Base{}; class Second:public virtual Base{}; cla ...

  7. 关于类的sizeof问题

    有如下例子: #include <iostream> using namespace std; class A { public:  virtual int getLen();  virt ...

  8. sizeof计算类大小

    类的sizeof大小一般是类中的所有成员的sizeof大小之和,这个就不用多说. 不过有两点需要注意:1)当类中含有虚成员函数的时候,例如: class B { float a; public: vi ...

  9. 使用sizeof计算类的大小

    类的sizeof大小一般是类中的所有成员的sizeof大小之和,这个就不用多说. 不过有两点需要注意:1)当类中含有虚成员函数的时候,例如: class B { float a; public: vi ...

最新文章

  1. Java基础:常见对象
  2. stm32的PWM占空比
  3. 从RSAC2017看威胁情报如何落地
  4. 提取Flash源文件中的素材
  5. C语言程序设计中十全十美,21世纪高校计算机应用技术系列规划教材 C语言程序设计-潭浩强主编 林小茶编著.pdf...
  6. 新欢乐时光病毒程序源码分析
  7. 浏览器访问php文件提示下载文件,php – 使用浏览器提示下载文件
  8. 语音社交APP系统开发,提供纯粹的语音社交
  9. ae中合成设置的快捷键_Adobe AE快捷键大全
  10. jQuery图像照片剪裁插件Jcrop中文演示
  11. %3chtml%3e%3c html,403禁止%3Chtml%3E%3Chead%3E%3Cmeta笨
  12. 解决图片旋转之后的位置问题
  13. 教学向|游戏低模角色建模教程,全是漂亮妹妹,GKD!
  14. iOS SDWebImage 清空缓存 新方法
  15. JSP程序-根据当前时间显示上午好、下午好、晚上好
  16. [生存志] 第129节 西汉兴相术
  17. 当所有人都站着吆喝,我选择退一步坐下
  18. 基于CentOs7的moodle平台搭建历程
  19. 通俗易懂的机器学习——集成学习
  20. angular4 新建模块

热门文章

  1. VC限制只能输入常规数字的CEdit控件
  2. Flutter 弧度与角度之间的换算
  3. java基础—计算: 2012-3-17到2012-4-6中间有多少天?
  4. 洛谷 P3320: bzoj 3991: LOJ 2182: [SDOI2015]寻宝游戏
  5. [剑指offer] 61. 序列化二叉树
  6. SpringMVC表单验证与Velocity整合
  7. C++11/14学习(二)类型推导
  8. 数据的标准化【转载】
  9. (小技巧)Sql server查看sql语句的执行时间(转)
  10. RHEL7 本地yum源配置