【发布时间】:2020-06-08 03:40:08
【问题描述】:
这是一个相当简单的问题,但相当混乱。
string R = "hhhh" ;
cout<< sizeof( R )<<endl;
输出:
4
变化:
字符串 R = "hhuuuuuuhh" ; cout
输出2:
4
出了什么问题?我应该改用 char 数组吗?
【问题讨论】:
-
因为它是在编译时评估的。
这是一个相当简单的问题,但相当混乱。
string R = "hhhh" ;
cout<< sizeof( R )<<endl;
输出:
4
变化:
字符串 R = "hhuuuuuuhh" ; cout
输出2:
4
出了什么问题?我应该改用 char 数组吗?
【问题讨论】:
认为sizeof 是编译时 可评估的。它评估类型的大小,而不是内容的大小。您甚至可以编写sizeof(std::string),对于任何std::string,它与sizeof(foo)完全相同相同instancefoo。
要计算std::string 中的字符数,请使用size()。
如果你有一个字符数组,比如说char c[6],那么c 的type 是一个array 6 chars。所以sizeof(c)(在编译时已知)将是 6,因为 C++ 标准定义单个 char 的大小为 1。
【讨论】:
std::string::length() 等价于std::string::size()。根据上下文,出于代码可读性的原因,length() 可能是首选。
sizeof expression 返回存储 type 表达式所需的大小(请参阅http://en.cppreference.com/w/cpp/language/sizeof)。对于std::string,它包含一个指向数据的指针(可能还有一个用于小字符串的缓冲区),但不包含数据本身,因此它不(也不能)依赖于字符串长度。
【讨论】:
您的字符串变量将由最常存储在堆栈中的部分组成,该部分具有固定的尺寸。这部分的大小是由 sizeof() 返回的。在这个固定部分内部是一个指向存储在堆上的部分的指针(或引用),它实际上包含您的字符并且具有不同的大小。但是这部分的大小只有在运行时才知道,而 sizeof() 是在编译时计算出来的。
您可能想知道为什么。像这样的事情既是 C++ 的优点也是缺点。 C++ 与例如 C++ 完全不同。 Python 和 C# 等语言。虽然后一种语言可以生成各种动态变化的元数据(如变量的大小或类型),但付出的代价是它们都很慢。 C++ 虽然有点“斯巴达式”,但可以围绕这些语言运行。事实上,大多数“动态”语言实际上都是用 C/C++ 实现(编程)的。
【讨论】: