哪个更适合字符串文字, 标准字符串或字符数组?哪一个使用const char []或const std :: string?
我的意思是说为常量字符串,说
const char name[] = "so"; //or to use
const string name = "so";
哪个更适合字符串文字, 标准字符串或字符数组?哪一个使用const char []或const std :: string?
我的意思是说为常量字符串,说
const char name[] = "so"; //or to use
const string name = "so";
对于字符串文字,只对来自文字的字符串常量,我会使用const char[]
。 std::string
的主要优点是它具有免费的内存管理,但这不是字符串文字的问题。
它是字面的实际类型,它可以直接用于任何需要旧C风格的空字符串或C++字符串(隐式转换踢入)的API。您还可以通过使用数组而不是指针来获得编译时间大小的实现。
现在,当定义函数接口,并且即使常量被传入时,我更喜欢std::string
而不是const char*
,因为在后一种情况下大小会丢失,并且可能需要重新计算。
出于我自己的经验。在对日志库(使用可变参数)的每次调用中,我都写了.c_str()
的老版本,用于包含信息/错误消息的文本字符串。
你应该用什么更适合你。如果没有特殊要求,我会使用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*
将是有效的,直到节目结束。
你在做什么呢?你的方法期望什么?
const char在存储中较轻,但没有std :: string的能力,或者使用它时的安全性。但是,如果你有很多C API,这可能是更明智的选择。
std :: string将是首选选项。
.c_str()是你的朋友:) – JPvdMerwe 2010-01-20 07:45:44
@JPvdMerwe:theatrus是正确的。如果你所做的只是将一个常量字符串传递给需要'const char *'的函数,那么使用'std :: string' /'.c_str()'没有意义。 'char'的'const'数组没有构造函数调用代价,并且可以直接传递给函数,这使得构造函数的成本更低,并且比std :: string更便宜。 – 2010-01-20 08:11:30
是的字符串文字,我完全同意,没有意义浪费你的处理器时间。 – JPvdMerwe 2010-01-20 09:12:12
对于字符串文字,我倾向于使用const std::string
而不是const char *
。由于将字符串文字传递到函数const std::string &
将在每次调用而不是仅仅调用一次时静静地创建字符串。但是,如果我主要使用函数期望const char *
的文字,我将使用它。
我倾向于赞成std::string
为apis。
当然,如果我使用unicode,我使用std::wstring
和wchar_t
。
我对unicode做了相同的假设,但这很有趣:http://utf8everywhere.org/。事实证明,wchar_t是unicode历史中简单时间的遗留物,Win32 API是WCHAR本地的。如果你坚持使用UTF-8和std :: string,生活可能会更好。 – terriblememory 2016-06-06 16:57:02
由于复制写入机制,如果你在许多不同的地方使用相同的字符串,它的速度在许多STL实现中会更快,而且它比普通的C字符串更容易使用。除此之外,如果您需要支持多种语言,我宁愿使用std :: wstring。 – jdehaan 2010-01-20 07:56:29
@jdehaan:如果存在(m)任何std库实现(不是STL实现,因为std :: string不是STL的一部分),那么我仍会感到惊讶。在MT环境中,这通常会变成悲观。我认为小字符串优化(小字符串不是分配在堆上,而是堆栈中)是现在通常喜欢的。 – sbi 2010-01-20 08:10:41
在大多数实现中,写入时的复制正在被删除(如果仍然存在)。它在多线程环境中有问题,因为从用户的角度来看,线程安全的某些操作(它们指向不同的std :: string)可能不是线程安全的。考虑一个字符串被复制,每个副本传递到不同的线程进行修改。每个线程都有它自己的字符串,没有共享对象,但实际上在'写时复制'内部实现中可能存在争用条件。在许多情况下,向库中添加锁定机制会使其变得比普通实现慢。 – 2010-01-20 08:12:26