提问者:小点点

字符串基础知识


到目前为止,我知道以下几种在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个答案

匿名用户

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

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

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

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

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

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

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

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

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

您显示的所有字符串都在堆栈上,甚至包括std::stringstd::string内置SSO(short string optimization),在堆栈上存储短字符串。