【问题标题】:std::string vs char array for static const静态常量的 std::string vs char 数组
【发布时间】:2015-08-27 20:04:42
【问题描述】:

我想在我的 cpp 文件中的多个位置使用字符串常量。我应该使用 std::string 还是 char[]?

static const std::string kConstantString = "ConstantStringValue";

static const char kConstantString[] = "ConstantStringValue";

有人告诉我更喜欢后者,因为它“避免了静态分配”。 char数组不是也得静态分配吗?

【问题讨论】:

  • 我更喜欢static const char[]的主要原因是避免std::string的对象指纹。您是否正在处理如此严格的限制?
  • This 可能会帮助您理解.....就个人而言,我会使用 std::string .....
  • @101010:嗯,什么? “物体指纹”?那是什么?
  • @LightnessRacesinOrbit 我的意思是std::string 的尺寸你携带的额外尺寸归因于该类。
  • 在这个demo 中,您可以看到std::string 带来了32 个字节的额外负担,这归因于该类。`

标签: c++ arrays static


【解决方案1】:

是的,是的,它也必须静态分配。

请始终使用std::string,除非您的分析器告诉您值得对const char[] 之类的旧式废话大发雷霆。选择const char[] 是对std::string 的烦人的微优化,并且是一个愚蠢的决定,除非您确定这段代码是热路径(因为它是静态的,我非常怀疑)。

【讨论】:

  • 投反对票。使用static const std::string 是一个灾难,因为静态初始化顺序惨败,有人可能会无意中在其他静态常量中使用它。我实际上看到它发生了好几次......
  • -1:不,没有分配发生。静态const char* 字符串将在二进制文件(RO 部分)中获得一个特殊位置。什么都没有得到 malloc'd,它只是“那里”可以访问。静态std::string 确实需要静态初始化,因此您正在为SIOF 敞开心扉,就像@Synxis 提到的那样。
【解决方案2】:

只需定义一个指向该字符串字面量的指针。:) 它可以有静态存储说明符。

没有任何必要使用类 std::string。它只是多余的和无用的。如果确实需要此常量,则始终可以将其转换为 std::string。

【讨论】:

  • 除了你忘记/忽略的所有原因,当然。
【解决方案3】:

因为它是static const,所以无论如何你都不能对这个字符串进行任何操作,所以最好只使用const char[]

【讨论】:

  • 只读“操纵”怎么样?如果可以使用std::string 函数而不是通过strcat() 等人,那么获取长度或将其连接到另一个字符串之类的事情会容易得多。当然,如果它只是一个标签并且不会被输入任何操作,那么 char 可能很好 - 但我们不要过于简单化(就像这里的所有其他答案一样......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
相关资源
最近更新 更多