std::string类实例保存有指向堆的指针,堆中实际存储字符串

偶然发现一个情况:

std::cout<<sizeof(std::string)<<"\n"; //24
struct Person{
    std::string name;   //24
    int age;            //8
    std::string arr[2]; //48
};
std::cout<<sizeof(Person)<<"\n"; //80
std::string mystr("白日依山尽,黄河入海流。欲穷千里目,更上一层楼。");
std::cout<<sizeof(mystr)<<"\n"; //24

在mac-clang++12上执行,给出std::string实例恒占用24个字节,不随字符串长度而变化。

想想也知道std::string类实例是保存有,指向实际存储字符串的内存块的指针。

转载自https://www.cnblogs.com/wangshujing/p/7341540.html

string的实现在各库中可能有所不同,但是在同一库中相同的一点是,无论你的string 里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配 的,与sizeof()无关。    sizeof(string)=4可能是最典型的实现之一,不过也有sizeof() 为12、32字节的库实现。

通常,我们所用到的 string 类型一般都会是这样实现:

      

class {
       char *_Ptr;    //指向字符串的指针
       int _Len;      //字符串的长度
       ........ 
}; 

 

所以,我们一般接触到的string类型所占字节数为 8+。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值