【问题标题】:String fundamentals弦乐基础
【发布时间】:2020-08-02 11:26:30
【问题描述】:

到目前为止,我知道以下在 C++ 中使用字符串的方法(尽管其中一些来自 C)

string string1 = "Hello";
char string2[] = "Hello";
char string3[] = {'H', 'e', 'l', 'l', 'o', 0};
const char *string4 = "Hello";
  1. 我发现第一种方法最方便,因为它支持多种方法并具有重载运算符。但我相信这也使它在性能方面的优化最少,是这样吗?
  2. 就性能/速度而言,哪种方法最好?
  3. 哪些分配在堆栈上,哪些分配在堆上?我的意思是我没有看到任何 new 关键字,但我的直觉告诉我不是这样。

【问题讨论】:

  • 计算机速度非常快。便利性被低估了,效率被高估了,尤其是初学者。问题三的答案是堆栈(可能),堆栈,堆栈,两者都不是。
  • 对“可能”答案的解释是大多数字符串实现都使用短字符串优化,这意味着短字符串在堆栈上分配。如果字符串很大,那么它将被堆分配。
  • 1.这是不正确的。 2. 目的是什么?只是坐在那里,还是用它做点什么? 3.也许栈也许堆;堆栈(如果在函数的上下文中);堆栈(string3string2 完全相同);指针是栈,指向的数据既不是栈也不是堆。
  • std::string 是动态的,因此它可能会将字符串保存在heap
  • 好吧,所以我假设性能不会有太大差异,因此使用第一种方法是最好的(至少在大多数情况下)。虽然我不确定我是否得到你们所说的 string4

标签: c++ memory-management c-strings stdstring


【解决方案1】:

我发现第一种方法最方便,因为它支持多种方法并具有重载运算符。

正确。它应该是您在 C++ 中处理字符串的默认方式。

但我相信这也使它在性能方面最优化,是这样吗?

优化程度最低?为了什么?就普通应用程序而言,std::string 的速度非常快。它针对许多用例进行了大量优化。大量非常聪明的人非常努力地确保它很快。看看这个SO question,其中有人试图自己实现std::string 操作之一,但无法超越std::string 的性能。

就性能/速度而言,哪种方法最好?

std::string 是最快的。在你说它不是之前,想想你将如何使用你的字符串。您是否在做以下任何事情?

  • 比较
  • 串联
  • 在函数中传递字符串
  • 正在搜索

std::string 可以非常快速地完成所有这些工作。但是,如果您最终使用 const char* 或 char 数组,您将不得不手动执行这些操作,这几乎肯定会std::string 实现慢。更不用说您必须解决的各种指针和内存问题。

其中哪些分配在堆栈上,哪些分配在堆上?我的意思是我没有看到任何新的关键字,但我的直觉告诉我不是这样。

您显示的所有字符串都在堆栈上,甚至是std::stringstd::string 内置了 SSO(短字符串优化),将短字符串存储在堆栈中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多