为什么字符串变量的sizeof()总是返回相同的数字,即使内容发生了变化
Why sizeof() of a string variable always return the same number even when content changes?
这是一个相当简单的问题,但非常令人困惑。
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个char
s的数组。因此,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++实现(编程)的。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- 在矢量中推回后,数字发生了变化
- 浮点数字0.1和0.5的精度如何在c中变化
- 为什么字符串变量的sizeof()总是返回相同的数字,即使内容发生了变化
- 查找数组中数字符号的变化量