C++类的大小——sizeof()

先看这么个问题——已知:

class  CBase
{
    
int   a;
    
char   * p;
};

那么运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;之后输出什么?

这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++类里面有个什么函数指针,也应该占字节吧!?什么指针来着?忘了(还是水平低不扎实)!流汗中……算了姑且认为是构造函数和析构函数吧。一人一个加上刚才那8个16个。好笑吗?这是我犯的错误!!!到底C++类的sizeof是多少呢?没有所谓的函数指针问题吗?不甘心,编个例子看看:

第一步:给丫来个空的(不好意思上火粗鲁了)

class  CBase
{
};

运行cout<<"sizeof(CBase)="<<sizeof(CBase)<<endl;

sizeof(CBase)=1;

为什么空的什么都没有是1呢?查资料……查啊查……OK这里了:先了解一个概念:类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化(别拿豆包不当干粮,空类也是类啊),所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。继续下一步:

第二步:

还是最初的那个类,运行结果:sizeof(CBase)=8

没什么说的,两个内部变量的大小。难道我记错了没有什么指针问题的存在?再试试(早这么有求知欲也不会丢人了,这回来劲了)

第三步:添个虚函数

class  CBase
{
public :
    CBase(
void );
    
virtual   ~ CBase( void );
private :
    
int    a;
    
char   * p;
};

再运行:sizeof(CBase)=12

嗨!问题出来了!!跟虚函数有关。为什么呢?查资料ing……

有了:“C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节”噢原来如此害死我了。那么继承类呢?

第四步:

基类就是上面的了不写了

class  CChild :
    
public  CBase
{
public :
    CChild(
void );
    
~ CChild( void );
private :
    
int  b;
};

运行:cout<<"sizeof(CChild)="<<sizeof(CChild)<<endl;

输出:sizeof(CChild)=16;

可见子类的大小是本身成员变量的大小加上子类的大小。

有空再补一下关于虚函数指针的知识吧。

 

 

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
C++中,获取字符串的长度可以使用以下四种方法: 1. `sizeof()`函数 在C++中,`sizeof()`函数用于获取数据型或变量所占用的内存大小,单位为字节。因此,可以使用`sizeof()`函数来获取字符串的长度,即字符串所占用的内存大小,包括字符串末尾的空字符('\0')。例如: ```c++ char str[] = "Hello"; int len = sizeof(str) / sizeof(char); // len = 6 ``` 需要注意的是,`sizeof()`函数返回的是编译时确定的值,因此对于动态分配的字符串,这种方法并不适用。 2. `size()`函数 在C++中,`size()`函数用于获取STL容器(如`string`)的大小,即容器中元素的个数。对于字符串,可以使用`size()`函数来获取其长度。例如: ```c++ string str = "Hello"; int len = str.size(); // len = 5 ``` 需要注意的是,`size()`函数返回的是容器中元素的个数,对于字符串来说,即字符串的长度。但是,`size()`函数并不包括字符串末尾的空字符('\0')。 3. `strlen()`函数 在C++中,`strlen()`函数用于获取C风格字符串的长度,即以空字符('\0')结尾的字符数组的长度。对于字符串,可以使用`strlen()`函数来获取其长度。例如: ```c++ char str[] = "Hello"; int len = strlen(str); // len = 5 ``` 需要注意的是,`strlen()`函数并不包括字符串末尾的空字符('\0')。 4. `length()`函数 在C++中,`length()`函数是`string`的成员函数,用于获取字符串的长度。与`size()`函数功能似,`length()`函数返回的是字符串的长度,不包括字符串末尾的空字符('\0')。例如: ```c++ string str = "Hello"; int len = str.length(); // len = 5 ``` 需要注意的是,`length()`函数只能用于`string`,不能用于C风格字符串。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值