字符串基础

String fundamentals

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

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

I find the first method to be the most convenient as it supports several methods and has overloaded operators.

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

But I believe that also makes it the least optimized in terms of performance, is that so?

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

Which method is the best in terms of performance / speed?

std::string 是最快的。在你说它不是之前,想想你将如何使用你的琴弦。您是否正在执行以下任一操作?

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

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

Which of these are allocated on stack and which on heap? I mean I don't see any new keyword, but then my intuition says otherwise.

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