You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C++中string对象与字符串字面量的sizeof结果不同?

为什么std::string对象与同内容字符串字面量的sizeof结果不同?

先看代码及运行结果:

#include <iostream>
using namespace std;
int main()
{
    string str = "abcdefghijklmnopqrstuvwy";
    cout << sizeof str << endl;
    cout<< sizeof "abcdefghijklmnopqrstuvwy"<<endl;
}

输出:

24
25

两者结果不同的核心原因是sizeof对这两种类型的计算逻辑完全不一样:

  • 字符串字面量的sizeof计算
    字符串字面量在C++中本质是const char[]类型,sizeof会直接计算整个字符数组的总字节数。你的字面量包含24个可见字符,而C风格字符串必须以'\0'作为结束标志,这个空字符会被编译器自动添加到数组末尾,所以总字节数是24+1=25,对应输出的25。

  • std::string对象的sizeof计算
    std::string是C标准库的类模板实例,sizeof(str)计算的是这个类对象本身占用的固定内存大小,和它存储的字符内容长度无关。在主流编译器(比如GCC的libstdc)的实现中,std::string采用了**小字符串优化(SSO)**设计,对象内部通常包含:

    • 用于指向堆内存的指针(或SSO模式下的字符缓冲区)
    • 记录当前字符串长度的整数
    • 记录当前容量的整数
      在64位系统中,这些成员的总大小刚好是24字节(8字节*3),这就是输出24的原因。哪怕字符串内容更长,只要对象本身的结构不变,sizeof的结果都不会变——字符数据要么存在对象内部的SSO缓冲区,要么存在堆上,这些都不算在对象自身的sizeof结果里。

内容的提问来源于stack exchange,提问作者Tashu Bansal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:52:10