为什么即使内容发生变化,字符串变量的sizeof()也始终返回相同的数字?

时间:2016-08-03 08:13:34

标签: c++ sizeof

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

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

输出:

4

变化:

字符串R =&#34; hhuuuuuuhh&#34; ; COUT&LT;&LT; sizeof(R)&lt;

OUTPUT2:

4

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

3 个答案:

答案 0 :(得分:4)

认为sizeof 编译时可评估。它评估的类型大小,而不是内容的大小。对于任何sizeof(std::string) 实例 sizeof(foo),您甚至可以std::string 与<{1}}完全相同。< / p>

要计算foo中的字符数,请使用std::string

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您的字符串变量将包含最常存储在堆栈中的部分,该部分具有固定的尺寸。这部分的大小是sizeof()返回的内容。在这个固定部分内部是一个存储在堆上的部分的指针(或引用),它实际上包含你的字符并具有不同的大小。但是,此部分的大小仅在运行时已知,而sizeof()在编译时计算。

你可能想知道为什么。像这样的事情既是C ++的优点也是弱点。 C ++是一个完全不同的野兽。 Python和C#等语言。虽然后面的语言可以产生各种动态变化的元数据(如变量的大小或类型),但支付的价格是它们都很慢。 C ++,虽然有点像'斯巴达&#39;,但可以围绕这些语言运行。事实上,大多数&#39;动态&#39;语言实际上是用C / C ++实现的(编程的)。

相关问题