【发布时间】:2011-01-07 04:03:56
【问题描述】:
哪个更适合字符串文字, 标准字符串还是字符数组?
我的意思是说对于常量字符串,比如说
const char name[] = "so"; //or to use
const string name = "so";
【问题讨论】:
标签: c++ arrays string stl char
哪个更适合字符串文字, 标准字符串还是字符数组?
我的意思是说对于常量字符串,比如说
const char name[] = "so"; //or to use
const string name = "so";
【问题讨论】:
标签: c++ arrays string stl char
对于字符串文字,并且仅对于来自文字的字符串常量,我会使用const char[]。 std::string 的主要优点是它有免费的内存管理,但这不是字符串文字的问题。
无论如何,它是文字的实际类型,它可以直接用在任何需要旧 C 样式以空终止字符串或 C++ 字符串(开始隐式转换)的 API 中。您还可以通过使用数组而不是指针来获得编译时大小的实现。
现在,在定义函数接口时,即使打算传入常量,我也更喜欢std::string 而不是const char*,因为在后一种情况下,大小会丢失,并且可能需要重新计算。
根据我自己的经验。对于带有信息/错误消息的文字字符串,我已经习惯在每次调用日志库(使用变量参数)时写 .c_str()。
【讨论】:
你用它做什么?你的方法期望什么?
const char 在存储上更轻巧,但没有 std::string 的强大功能,也没有使用它时的安全性。但是,如果您有很多 C API,则可能是更明智的选择。
std::string 将是首选选项。
【讨论】:
const char* 的函数,那么使用std::string / .c_str() 毫无意义。 const 数组 char 没有构造函数调用成本,可以直接传递给函数,这使得构造和传递给函数的成本比 std::string 更便宜。
您应该使用更适合您的。如果没有特殊要求,我会使用std::string,因为它可以完成所有内存工作。
对于字符串文字,我会使用const char*。反对const char[] 的原因是您可以使用const char* 来初始化另一个常量。检查以下代码:
const char str1[] = "str1";
const char* str11 = "str11";
const char str2[] = str1; // <<< compile error
const char* str22 = str11; // <<< OK
字符串字面量具有静态存储期限(根据 2.13.4/2),因此指针 const char* 将在程序完成之前有效。
【讨论】:
std::string 不是 STL 的一部分)仍然在做 COW,我会感到惊讶。在 MT 环境中,这通常会变成悲观。我认为小字符串优化(小字符串不是在堆上分配,而是在栈上)是现在普遍青睐的。
string::string 将复制它并且不会使用COW,假设编译器除了字符串文字之外没有特殊的内部类型const char[] 和一个自嘲的 STL。
对于字符串文字,我倾向于使用const std::string 而不是const char *。因为将字符串文字传递给采用const std::string & 的函数将在每次调用它们时默默地创建字符串,而不仅仅是一个。但是,如果我主要将文字与期望 const char * 的函数一起使用,我将改用它。
我倾向于使用std::string 来使用 api。
当然,如果我使用 unicode,我会使用 std::wstring 和 wchar_t。
【讨论】: