2010-01-20 88 views

回答

8

对于字符串文字,只对来自文字的字符串常量,我会使用const char[]std::string的主要优点是它具有免费的内存管理,但这不是字符串文字的问题。

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

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

出于我自己的经验。在对日志库(使用可变参数)的每次调用中,我都写了.c_str()的老版本,用于包含信息/错误消息的文本字符串。

2

你应该用什么更适合你。如果没有特殊要求,我会使用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*将是有效的,直到节目结束。

+0

由于复制写入机制,如果你在许多不同的地方使用相同的字符串,它的速度在许多STL实现中会更快,而且它比普通的C字符串更容易使用。除此之外,如果您需要支持多种语言,我宁愿使用std :: wstring。 – jdehaan 2010-01-20 07:56:29

+0

@jdehaan:如果存在(m)任何std库实现(不是STL实现,因为std :: string不是STL的一部分),那么我仍会感到惊讶。在MT环境中,这通常会变成悲观。我认为小字符串优化(小字符串不是分配在堆上,而是堆栈中)是现在通常喜欢的。 – sbi 2010-01-20 08:10:41

+0

在大多数实现中,写入时的复制正在被删除(如果仍然存在)。它在多线程环境中有问题,因为从用户的角度来看,线程安全的某些操作(它们指向不同的std :: string)可能不是线程安全的。考虑一个字符串被复制,每个副本传递到不同的线程进行修改。每个线程都有它自己的字符串,没有共享对象,但实际上在'写时复制'内部实现中可能存在争用条件。在许多情况下,向库中添加锁定机制会使其变得比普通实现慢。 – 2010-01-20 08:12:26

2

你在做什么呢?你的方法期望什么?

const char在存储中较轻,但没有std :: string的能力,或者使用它时的安全性。但是,如果你有很多C API,这可能是更明智的选择。

std :: string将是首选选项。

+2

.c_str()是你的朋友:) – JPvdMerwe 2010-01-20 07:45:44

+0

@JPvdMerwe:theatrus是正确的。如果你所做的只是将一个常量字符串传递给需要'const char *'的函数,那么使用'std :: string' /'.c_str()'没有意义。 'char'的'const'数组没有构造函数调用代价,并且可以直接传递给函数,这使得构造函数的成本更低,并且比std :: string更便宜。 – 2010-01-20 08:11:30

+0

是的字符串文字,我完全同意,没有意义浪费你的处理器时间。 – JPvdMerwe 2010-01-20 09:12:12

1

对于字符串文字,我倾向于使用const std::string而不是const char *。由于将字符串文字传递到函数const std::string &将在每次调用而不是仅仅调用一次时静静地创建字符串。但是,如果我主要使用函数期望const char *的文字,我将使用它。

我倾向于赞成std::string为apis。

当然,如果我使用unicode,我使用std::wstringwchar_t

+0

我对unicode做了相同的假设,但这很有趣:http://utf8everywhere.org/。事实证明,wchar_t是unicode历史中简单时间的遗留物,Win32 API是WCHAR本地的。如果你坚持使用UTF-8和std :: string,生活可能会更好。 – terriblememory 2016-06-06 16:57:02

相关问题