【问题标题】:where to use c++(i.e std::string) String and where to use '\0' terminated c string [duplicate]在哪里使用c ++(即std :: string)字符串以及在哪里使用'\ 0'终止的c字符串[重复]
【发布时间】:2014-03-02 22:56:34
【问题描述】:

在哪里使用 std::string 以及在哪里使用 '\0' 终止的 C 字符串。
基本上我想知道他们之间有什么优势。

【问题讨论】:

  • 始终使用std::string,如果您需要一个以空字符结尾的字符串(例如使用C API 时),请调用c_str() 方法。

标签: c++ string


【解决方案1】:

c++ std::string:

总体而言,字符串比 char* 更安全。通常,当您使用 char* 进行操作时,您必须检查以确保事情正确,在字符串类中,所有这些都是为您完成的。 通常在使用 char* 时,您必须释放分配的内存,而不必对字符串执行此操作,因为它会在销毁时释放其内部缓冲区。 字符串与 c++ stringstream 配合得很好,格式化 IO 非常简单。

字符

使用 char* 可以让您更好地控制“幕后”发生的事情,这意味着您可以根据需要调整性能。

【讨论】:

  • 零终止字符串在性能关键应用程序中不是那么好 - 考虑 strlen() 或 strcat() 的复杂性
  • 实际上,使用自定义字符串类调整性能要容易得多。 char* 很难调整。主要原因是字符串性能受引用位置的影响,因此小字符串优化是最重要的工具。请注意,std::string 的许多实现已经具有 SSO。即使没有专门针对您的使用进行调整,它仍然胜过完全没有 SSO 的 char*
  • @MSalters 哪些实现有 SSO?我不认为赢得大多数人的胜利是有保证的。但无论如何,“调”是一个流行词,通常可以假设它压制了它的封闭论点。
  • AFAIK MSVC 有,以及提议的新 GCC 字符串类(尚未使用,因为添加 SSO 显然会破坏 ABI)
【解决方案2】:

零终止的 char* 与 C 接口和 std::string 一起使用 - 在常见的 c++ 代码中。但并不是唯一的选择——如果你真的很了解性能,你可能想要编写自己的字符串类(例如,没有动态内存分配的固定长度)

【讨论】:

    猜你喜欢
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多