为什么在c+中使用c字符串+;? 在C++中使用C字符串有什么好的理由吗?我的教科书在某些方面使用了它们,我真的觉得仅仅使用std::string会更容易。

为什么在c+中使用c字符串+;? 在C++中使用C字符串有什么好的理由吗?我的教科书在某些方面使用了它们,我真的觉得仅仅使用std::string会更容易。,c++,c,stl,string,c-strings,C++,C,Stl,String,C Strings,因为这就是它们来自众多API/库的原因?STL string肯定更容易使用,我看不出有任何理由不使用它们 如果您需要与只使用C样式字符串作为参数的库进行交互,则始终可以调用string类的C_str()方法。我不得不使用它们的唯一原因是与使用C样式字符串的第三方库进行交互时。也可能会有一些深奥的情况,你可以使用C风格的字符串来执行性能,但是通常情况下,使用C++字符串的方法可能由于内联和专门化等而更快。 在处理这类API时,您可以在许多情况下使用该方法,但是您应该知道返回的char*是const

因为这就是它们来自众多API/库的原因?

STL string肯定更容易使用,我看不出有任何理由不使用它们


如果您需要与只使用C样式字符串作为参数的库进行交互,则始终可以调用string类的C_str()方法。

我不得不使用它们的唯一原因是与使用C样式字符串的第三方库进行交互时。也可能会有一些深奥的情况,你可以使用C风格的字符串来执行性能,但是通常情况下,使用C++字符串的方法可能由于内联和专门化等而更快。
在处理这类API时,您可以在许多情况下使用该方法,但是您应该知道返回的char*是const,并且不应该通过该指针修改字符串。在这种情况下,您仍然可以使用向量来代替,并且至少可以获得更容易的内存管理的好处。

假设您的代码中有一些字符串常量,这是一种非常常见的需要。最好将这些字符串定义为C字符串,而不是C++对象——更轻量级、更便携等。现在,如果你要把这些字符串传递给各种函数,那么如果这些函数接受C字符串而不是要求C++字符串对象,那就很好了。

当然,如果字符串是可变的,那么使用C++字符串对象就更方便了。

< P>如果C++代码是“深”的(接近内核,严重依赖于C库等),您可能需要明确使用C字符串,避免在STD::String中的大量转换。当然,如果您正在与其他语言域(Python、Ruby等)进行交互,您也可能出于同样的原因这样做。否则,请使用std::string。

如果函数需要一个常量字符串,即使程序在其他地方使用std::string、CString、EString或任何东西,我仍然喜欢使用“const char*”(或const wchar_t*)


在一个大的代码库中有太多的字符串来源,以确保调用方的字符串为STD::string和const char *是最低的公分母。< /P> < P>给出了选择,一般没有理由选择C++字符串(<代码> char */COD>)在C++字符串上(<代码> STD::String )。然而,通常你没有选择的余地。例如,出于历史原因,

std::fstream
的构造函数采用C字符串。而且,C库(你猜对了!)使用C字符串


在你自己的C++代码中,最好使用 STD::String ,并根据.< /P>< P>教科书的特点,使用旧的C字符串来提取对象的C字符串,因为许多基本函数仍然期望它们作为参数,或者返回它们。此外,它还提供了对内存中字符串的底层结构的一些深入了解。

这取决于您使用的库。例如,在使用时,在使用Windows API的各个部分时,使用CString通常更容易。在Win32应用程序中,它的性能似乎也优于std::string


但是,STD::String是C++标准的一部分,因此,如果您希望更好的可移植性,那么对于应用程序(如大多数嵌入式平台)来说,要使用STD::Stry.< /P> < P>,在那里没有堆叠的字符串来存储被操作的字符串,并且需要确定的字符串缓冲区预分配。

c字符串不承担作为类的开销

c字符串通常会导致更快的代码,因为它们更接近机器级别

这并不是说,你不能用它们写糟糕的代码。它们可能被误用,就像其他构造一样

由于历史原因,有大量的藏书室电话需要这些电话


学习使用c字符串和stl字符串,并在有意义时使用它们。

这样做的通常原因是您喜欢在字符串处理中写入缓冲区溢出。计数字符串比终止字符串优越得多,很难理解C设计人员为什么使用终止字符串。那是一个糟糕的决定;现在这是一个错误的决定。

内存控制。我最近不得不在一个大规模多线程应用程序中处理大约200-300MB大小的字符串(实际上是数据库中的blob)。在这种情况下,字符串的多个副本可能会使32位地址空间爆裂。我必须确切地知道这个字符串有多少个副本。虽然我是STL的传道者,但我使用了char*因为它保证了没有额外的内存,甚至没有额外的拷贝被分配。我确切地知道它需要多少空间


除此之外,标准STL字符串处理忽略了一些用于字符串处理/解析的强大C函数。谢天谢地,std::string具有c_str()方法,用于对内部缓冲区进行常量访问。要使用Prtff(),你仍然必须使用char *(但是C++的一个疯狂的想法不包括(如)PrtfF类功能,这是C中最有用的函数之一。我希望Boo::格式很快就会包含在STL中。

< P>更多的内存控制注释:

C字符串是POD类型,因此可以在应用程序的只读数据段中分配它们。如果在命名空间范围中声明并定义
std::string
常量,编译器将生成在
main()之前运行的其他代码< /Cord>调用每个常数的构造函数。如果应用程序有许多常量字符串(例如,如果您已经生成了使用常量字符串的C++代码),那么在这种情况下C字符串可能是更好的。
std::string
的一些实现支持称为SSO(“短字符串优化”或“小字符串优化”)的功能,其中
std::string
类包含存储