C++ 使用const char[]还是const std::string?

C++ 使用const char[]还是const std::string?,c++,arrays,string,stl,char,C++,Arrays,String,Stl,Char,哪个更适合字符串文字, 标准字符串还是字符数组 我的意思是对于常量字符串,比如 const char name[] = "so"; //or to use const string name = "so"; 你应该使用更适合你的东西。如果没有特殊要求,我会使用std::string,因为它可以完成所有内存工作 对于字符串文本,我将使用constchar*。反对const char[]的原因是可以使用const char*初始化另一个常量。检查以下代码: const char str1[] =

哪个更适合字符串文字, 标准字符串还是字符数组

我的意思是对于常量字符串,比如

const char name[] = "so"; //or to use 
const string name = "so";

你应该使用更适合你的东西。如果没有特殊要求,我会使用
std::string
,因为它可以完成所有内存工作

对于字符串文本,我将使用
constchar*
。反对
const char[]
的原因是可以使用
const char*
初始化另一个常量。检查以下代码:

const char str1[] = "str1";
const char* str11 = "str11";

const char str2[] = str1;    // <<< compile error
const char* str22 = str11;   // <<< OK
const char str1[]=“str1”;
常量字符*str11=“str11”;

常量字符str2[]=str1;// 你拿它干什么?你的方法期望什么

const char在存储中较轻,但没有std::string的功能,也没有使用它时的安全性。但是,如果您有很多C API,那么它可能是更明智的选择


std::string将是首选选项。

对于字符串文本,并且仅对于来自文本的字符串常量,我将使用
const char[]
std::string
的主要优点是它可以免费进行内存管理,但这不是字符串文本的问题

无论如何,它是文字的实际类型,它可以直接用于任何需要旧C风格的空结尾字符串或C++字符串(隐式转换开头)的API。您还可以通过使用数组而不是指针来获得编译时大小实现

现在,在定义函数接口时,即使打算传入常量,我还是更喜欢
std::string
,而不是
const char*
,因为在后一种情况下,大小丢失,可能需要重新计算


根据我自己的经验。我越来越习惯于在每次调用日志库(使用变量参数)时为带有信息/错误消息的文本字符串编写
.c_str()

对于字符串文本,我倾向于
const std::string
而不是
const char*
。因为将字符串文本传递到使用
const std::string&
的函数中,将在每次调用它们时以静默方式创建字符串,而不仅仅是一个字符串。但是,如果我主要将literal用于预期为
const char*
的函数,我将使用它

对于API,我倾向于使用
std::string


当然,如果我使用unicode,我会使用
std::wstring
wchar\u t

,并且在许多STL实现中速度更快,这要归功于一种写时拷贝机制,如果你在许多不同的地方使用相同的字符串,那么它比普通的C字符串更容易使用。除此之外,如果您需要支持多种语言,我宁愿使用std::wstring。@jdehaan:如果有(m)种std库实现(不是STL实现,因为
std::string
不是STL的一部分),我会感到惊讶。在机器翻译环境中,这通常会变成一种悲观情绪。我认为小字符串优化(小字符串不是在堆上分配的,而是在堆栈上分配的)是现在最受欢迎的。在大多数实现中,写时复制正在被删除(如果仍然存在的话)。它在多线程环境中存在问题,因为从用户的角度来看,某些看起来是线程安全的操作(它们指的是不同的std::string)可能不是线程安全的。考虑通过复制到不同线程上的每个副本进行修改的字符串。每个线程都有自己的字符串,没有共享对象,但实际上在“写时复制”内部实现中可能存在竞争条件。在许多情况下,向库中添加锁定机制会使它比普通实现慢。@sbi,@dribeas,感谢您的提示,我确实仍然使用较旧的实现。。。我从不使用.NET做我的项目。我知道我必须更新我对现代STL实现的知识。谢谢。@jdehaan,@sbi在任何情况下,直接将字符串文本传递给
string::string
都会复制它,并且不会使用COW,前提是编译器除了
const char[]
和一个可以起作用的STL之外,没有特殊的字符串文本内部类型。@JPvdMerwe:theatrus是正确的。如果您所做的只是将常量字符串传递给需要
const char*
的函数,那么使用
std::string
/
.c_str()
是没有意义的。
const
数组的
char
没有构造函数调用成本,可以直接传递给函数,这使得构造和传递给函数比
std::string
更便宜。是的,对于字符串文本,我完全同意,没有必要浪费处理器时间。我对unicode做了同样的假设,但这很有趣:。事实证明,wchar__t是unicode历史上一个更简单时代的遗留物,作为wchar本机的Win32 API也是如此。如果你坚持使用UTF-8和std::string,生活可能会更好。