【问题标题】:Why sizeof() of a string variable always return the same number even when content changes?为什么即使内容发生变化,字符串变量的 sizeof() 总是返回相同的数字?
【发布时间】:2020-06-08 03:40:08
【问题描述】:

这是一个相当简单的问题,但相当混乱。

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

输出:

4

变化:

字符串 R = "hhuuuuuuhh" ; cout

输出2:

4

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

【问题讨论】:

  • 因为它是在编译时评估的。

标签: c++ sizeof


【解决方案1】:

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

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

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

【讨论】:

  • std::string::length() 等价于std::string::size()。根据上下文,出于代码可读性的原因,length() 可能是首选。
  • 但是如果我想知道字节数而不是长度怎么办?
  • 我想是的,因为我想知道我想通过串口接收和发送多少字节。谢谢!
  • @Tomas Dittmann 垃圾!为什么我要为每种容器类型使用不同的函数来检查它的大小?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2015-11-20
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      相关资源
      最近更新 更多