这是一个相当简单的问题,但非常令人困惑。
string R = "hhhh" ;
cout<< sizeof( R )<<endl;
输出:
4
变化:
字符串R =&#34; hhuuuuuuhh&#34; ; COUT&LT;&LT; sizeof(R)&lt;
OUTPUT2:
4
出了什么问题?我应该使用char数组吗?
答案 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 ++实现的(编程的)。