c++ 类的sizeof

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为什么是12字节。这就涉及到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函数是不同的。

c++ 类的sizeof

时间: 2024-10-04 13:49:50

c++ 类的sizeof的相关文章

C+类的sizeof大小以及类的字节对齐

对class求sizeof的问题总结 首先看如下代码: 1 class A 2 { 3 public: 4 A(){}; 5 ~A(){}; 6 private: 7 int a; 8 double b; 9 }; 10 11 class B:public A 12 { 13 public: 14 B(){}; 15 ~B(){}; 16 private: 17 int a; 18 char b; 19 }; 20 21 cout <<sizeof(A)<<sizeof(B)<

C++空类的sizeof

在金山WPS的面试中,有一道题目是这样的: A是一个空类,求A的内存大小: class A{}; cout <<sizeof(A)<<endl; 在64位的VS2013中,运行结果是:1. 原因是:即使是空类,在实例化后的内存中也是独一无二的,所以不能是0.根据编译器的不同,会给空类隐含添加一个字节,这样实例化后,这个类就是独一无二的了. 同理,struct也是如此.

含有虚函数的类sizeof大小

#include <iostream> using namespace std; class Base1{ virtual void fun1(){} virtual void fun11(){} public: virtual ~Base1(); }; class Base2{ virtual void fun2(){} }; class DerivedFromOne: public Base2 { virtual void fun2(){} virtual void fun22(){} }

【转载】C++类的大小——sizeof()

先看这么个问题——已知: class CBase{int  a;char *p;}; 那么运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;之后输出什么? 这个应该很简单,两个成员变量所占的大小有嘛——8.可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++类里面有个什么 函数指针,也应该占字节吧!?什么指针来着?忘了(还是水平低不扎实)!流汗中……算了姑且认为是构造函数和析构函数吧.一

sizeof(类)

类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小.首先:我们要知道什么是类的实例化,所谓类的实例化就是在内存中分配一块地址 用sizeof对类名操作,得到的结果是该类的对象在存储器中所占据的字节大小,由于静态成员变量不在对象中存储,因此这个结果等于各非静态数据成员(不包括成员函数)的总和加上编译器额外增加的字节.后者依赖于不同的编译器实现,C++标准对此不做任何保证. 确定类大小的几个原则: 为类的非静态成员数

sizeof与类

问:定义一个空类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果为? 答:1. 问:为什么不是0? 答:空类型的实例中不包含任何信息,本来求其sizeof应为0,但当声明该类型的实例时,它必须在内存中占有一定的空间,否则无法使用 这些实例.而其所占空间的大小,由编译器决定.VS中,每个空类型的实例占用1字节的空间.[linux下实践也为1] 问:如果在该类型中添加一个构造函数和析构函数,再对该类型求sizeof,得到的结果为? 答:仍为1.因为调用构造函数和析构函数只需要知

sizeof的计算

一般而言,需满足三个准则: 1.结构体变量的首地址能够被最宽基本类型成员的大小所整除 2.结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节 3.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后填充字节 说明: 1.基本类型是指前面提到的像 char  short  int   float double  这样的内置数据类型 2.对于复合数据类型,如结构体嵌套结构体,那么基本类型是指前面提到的像char.

C++中的类所占内存空间总结

C++中的类所占内存空间总结 最近在复习c++的一些基础,感觉这篇文章很不错,转载来,大家看看! 类所占内存的大小是由成员变量(静态变量除外)决定的,成员函数(这是笼统的说,后面会细说)是不计算在内的. 摘抄部分: 成员函数还是以一般的函数一样的存在.a.fun()是通过fun(a.this)来调用的.所谓成员函数只是在名义上是类里的.其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码.而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table

C++ 类的继承、虚拟继承、隐藏、占用空间

主函数: 1 #include <iostream> 2 #include "test.h" 3 #include "testfuc.h" 4 using namespace std; 5 6 int main(void) 7 { 8 a *p=new b(); 9 10 p->fuc(); 11 12 cout<<"指针p占用空间"<<sizeof(p)<<endl; 13 cout<