16

“人们应该始终使用std::string而不是 c 风格的 strings( char *)”是几乎所有发布在此处的源代码的建议。虽然建议无疑是好的,但要解决的实际问题不允许详细说明为什么?方面的建议详细。这个问题是作为相同的占位符。

一个好的答案应该包括以下几个方面(详细):

  1. 为什么要std::string在 C++ 中使用 c 风格的字符串?
  2. 中提到的做法有哪些缺点(如果有的话)#1
  3. 在哪些情况下,与中提到的建议相反#1是一种好的做法?
4

6 回答 6

16
  1. std::string 管理自己的内存,因此您可以轻松地复制、创建、销毁它们。
  2. 您不能将自己的缓冲区用作 std::string。
  3. 您需要将 ac 字符串/缓冲区传递给期望获得缓冲区所有权的东西 - 例如第 3 方 C 库。
于 2012-04-05T03:05:09.710 回答
4

好吧,如果您需要一个字符数组,std::string 几乎没有什么优势。但面对现实,这种情况多久发生一次?通过使用像 std::string 这样的附加功能包装一个 char 数组,您可以获得某些操作的功率和效率。

例如,确定字符数组的长度需要“计数”数组中的字符。相比之下,std::string 为这个特定任务提供了有效的操作。(见https://stackoverflow.com/a/1467497/129622

  1. 为了动力、效率和理智
  2. 比“仅”一个字符数组更大的内存占用
  3. 当您需要一个字符数组时
于 2012-04-05T03:12:55.683 回答
3

3)当然,总是使用string的建议必须带有一点常识。字符串文字是const char[],如果你将文字传递给一个接受const char*(例如std::ifstream::open())的函数,那么将它包装在std::string.

于 2012-04-05T07:54:14.833 回答
1

char* 基本上是指向字符的指针。C 所做的是经常使这个指针指向数组中的第一个字符。

std::string 是一个很像向量的类。在内部,它处理字符数组的存储,并为用户提供几个成员函数来操作所述存储数组以及几个重载运算符。

在 std::string 上使用 char* 的原因:

C backwards-compatibility.
Performance (potentially).
char*s have lower-level access.

在 char* 上使用 std::string 的原因:

Much more intuitive to use.
Better searching, replacement, and manipulation functions.
Reduced risk of segmentation faults.

例子 :

char* 必须与 char 数组或动态分配的 char 数组结合使用。毕竟,一个指针是毫无价值的,除非它真的指向某个东西。这主要用在 C 程序中:

char somebuffer[100] = "a string";
char* ptr = somebuffer;  // ptr now points to somebuffer
cout << ptr; // prints "a string"
somebuffer[0] = 'b';  // change somebuffer
cout << ptr;  // prints "b string" 

请注意,当您更改“somebuffer”时,“ptr”也会更改。这是因为 somebuffer 在这种情况下是实际的字符串。ptr 只是指向/引用它。

使用 std::string 就不那么奇怪了:

std::string a = "a string";
std::string b = a;
cout << b;  // prints "a string"
a[0] = 'b';  // change 'a'
cout << b;  // prints "a string" (not "b string") 

在这里,您可以看到更改 'a' 不会影响 'b',因为 'b' 是实际的字符串。

但实际上,主要区别在于,对于 char 数组,您负责管理内存,而 std::string 为您完成。在 C++ 中,几乎没有理由在字符串上使用 char 数组。100 次中有 99 次你最好用一根绳子。

在您完全了解内存管理和指针之前,只需省去一些麻烦并使用 std::string。

于 2012-08-10T21:15:02.943 回答
1

为什么要在 C++ 中使用 std::string 而不是 c 风格的字符串?

主要原因是它使您无需管理字符串数据的生命周期。您可以将字符串视为值,让编译器/库担心管理内存。

手动管理内存分配和生命周期是乏味且容易出错的。

#1 中提到的做法有哪些缺点(如果有的话)?

您放弃了对内存分配和复制的细粒度控制。这意味着您最终会选择由您的工具链供应商选择的内存管理策略,而不是选择与您的程序需求相匹配的策略。

如果您不小心,最终可能会出现大量不需要的数据复制(在非引用实现中)或引用计数操作(在引用计数实现中)

在混合语言项目中,任何参数使用 std::string 的函数或任何包含 std::string 的数据结构都不能直接从其他语言中使用。

在哪些情况下,与 #1 中提到的建议相反是一种好的做法?

不同的人对此会有不同的看法,但IMO

  • 对于函数参数,在“const char *”中传递字符串是一个不错的选择,因为它避免了不必要的复制/引用,并为调用者提供了关于它们传递的内容的灵活性。
  • 对于用于与其他语言互操作的东西,您别无选择,只能使用 c 风格的字符串。
  • 当您有已知的长度限制时,使用固定大小的数组可能会更快。
  • 在处理非常长的字符串时,最好使用一个肯定会被引用而不是复制的结构(例如包装在 shared_ptr 中的字符数组),或者实际上完全使用不同类型的数据结构
于 2016-07-26T13:22:52.830 回答
-1

一般来说,您应该始终使用 std::string,因为它不太容易出错。请注意,std::string 的内存开销很大。最近我做了一些关于 std::string 开销的实验。一般来说,它大约是 48 字节!文章在这里:http: //jovislab.com/blog/ ?p=76 。

于 2012-04-13T17:35:14.023 回答