为什么字符串变量的sizeof()总是返回相同的数字,即使内容发生了变化

Why sizeof() of a string variable always return the same number even when content changes?

本文关键字:数字 变化 发生了 返回 sizeof 变量 字符串 为什么      更新时间:2023-10-16

这是一个相当简单的问题,但非常令人困惑。

string R = "hhhh" ;
cout<< sizeof( R )<<endl;

输出:

4

变化:

string R="hhuuuuuuhh";cout<lt;sizeof(R)<

输出2:

4

出了什么问题?我应该使用char数组吗?

认为sizeof是编译时可评估的。它的计算结果是类型的大小,而不是内容的大小。您甚至可以为任何std::string实例foo编写与sizeof(foo)完全相同的sizeof(std::string)

要计算std::string中的字符数,请使用size()

如果您有一个字符数组,比如char c[6],那么c类型是6个chars的数组。因此,sizeof(c)(在编译时已知)将是6,因为C++标准将单个char的大小定义为1。

sizeof expression返回类型表达式的存储所需的大小(请参阅http://en.cppreference.com/w/cpp/language/sizeof)。在std::string的情况下,它包含一个指向数据的指针(可能还有一个小字符串的缓冲区),但不包含数据本身,因此它不(也不可能)依赖于字符串长度。

您的字符串变量将由一个通常存储在堆栈中的部分组成,该部分具有固定的维度。此部件的大小是sizeof()返回的大小。在这个固定部分中有一个指向存储在堆中的部分的指针(或引用),该部分实际上包含您的字符,并且大小不同。然而,这个部分的大小只有在运行时才知道,而sizeof()是在编译时计算的。

你可能想知道为什么。像这样的事情既是C++的长处,也是它的弱点。C++与Python和C#等语言完全不同。虽然后一种语言可以生成各种动态变化的元数据(比如变量的大小或类型),但代价是它们都很慢。C++虽然有点"斯巴达式",但可以围绕这些语言运行。事实上,大多数"动态"语言实际上都是用C/C++实现(编程)的。