Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用字符串(C+;+;)的任何缺点_C++_String_Stl - Fatal编程技术网

C++ 使用字符串(C+;+;)的任何缺点

C++ 使用字符串(C+;+;)的任何缺点,c++,string,stl,C++,String,Stl,事实上,我在谷歌上查了一下,但我通常发现情况正好相反。 C++中使用字符串库字符串而不是C字符串或某种字符数组是否有任何缺点?除了可能慢一点之外 请随便给我指一个傻瓜,不过我已经搜索过了,什么也找不到(尽管我肯定有人问过)编辑 对不起,我完全误解了你的问题。至于缺点,我相信string类的一些实现使用了引用计数,这可能会导致多线程应用程序出现意外的性能特征。假设std::string的供应商实现是有能力的,那么实际上没有明显的缺点。std::string类不太可能比启用编译器优化的普通C字符串慢

事实上,我在谷歌上查了一下,但我通常发现情况正好相反。 C++中使用字符串库字符串而不是C字符串或某种字符数组是否有任何缺点?除了可能慢一点之外

请随便给我指一个傻瓜,不过我已经搜索过了,什么也找不到(尽管我肯定有人问过)

编辑


对不起,我完全误解了你的问题。至于缺点,我相信
string
类的一些实现使用了引用计数,这可能会导致多线程应用程序出现意外的性能特征。

假设
std::string
的供应商实现是有能力的,那么实际上没有明显的缺点。
std::string
类不太可能比启用编译器优化的普通C字符串慢

即使您发现自己需要一个C字符串(比如说,您需要使用一个采用
const char*
)的API),您仍然需要
std::string::C_str()

您可能遇到的一个可能的缺点是以非线程安全方式实现语义的供应商实现。(见附件)

然而,这在C++0x中不是问题,甚至在C++03中,它实际上是一个有问题的供应商实现的示例,而不是
std::string
的任何固有错误


另一个可能的缺点是,对于C++03标准中的措辞是否需要
std::string
实现来使用连续内存缓冲区,存在一些争论。这使得您是否可以直接从文件读取到
std::string
对象中有些疑问。然而,很容易争辩说C++03标准实际上隐含地需要一个连续的缓冲区,不管怎样,这主要是一个学术问题,因为在实践中1)大多数(或所有)的
std::string实现实际上都提供了一个连续的缓冲区,2)对于C++0x来说这个问题是没有意义的,它显式地需要一个连续的缓冲区。

答案取决于你在做什么。如果您依赖于使用C字符串的外部库,请务必使用C字符串

或者。。。也许你有一个完整的C字符串库,你已经用了很多年了


否则我会使用stdlib字符串。

我能想到的唯一可能的情况是当您需要处理非常大的字符串时(比如,一些兆字节/千兆字节)。在这种情况下,如果选择了STL字符串类,您需要做很多技巧来避免复制并实现新的放置。对于这样的操作,字符数组将非常简单。

std::string是否更快取决于实现。非COW实现在按值传递std::string时分配内存并复制数据,而COW实现(GNU std::string)只是增加引用计数器。