为什么在c ++中使用c字符串?

Jas*_*ker 18 c c++ string stl c-strings

现在有没有什么好的理由在C++中使用C-strings?我的教科书在某些方面的例子中使用它们,我觉得使用std :: string会更容易.

dvo*_*rak 22

我必须使用它们的唯一原因是与使用C样式字符串的第三方库连接时.出于性能原因,可能还会有一些深奥的情况,你会使用C样式字符串,但更多时候,由于内联和专业化等原因,使用C++字符串上的方法可能更快.

c_str()在使用这些API时,您可以在许多情况下使用该方法,但是您应该知道返回的char*是const,并且您不应该通过该指针修改字符串.在这种情况下,你仍然可以使用vector <char>,至少可以获得更简单的内存管理.

  • 返回值是const的原因.使用const_cast或C强制转换修改它会使内部对象状态失去同步.它应该是"不得修改",而不是"不应该". (3认同)

bk1*_*k1e 14

更多内存控制说明:

C字符串是POD类型,因此可以在应用程序的只读数据段中分配它们.如果std::string在命名空间范围内声明和定义常量,编译器将生成在main()调用std::string每个常量的构造函数之前运行的其他代码.如果您的应用程序有许多常量字符串(例如,如果您生成了使用常量字符串的C++代码),则在这种情况下可能更喜欢C字符串.

某些实现std::string支持称为SSO("短字符串优化"或"小字符串优化")的功能,其中std::string该类包含最多一定长度的字符串的存储.这增加了大小,std::string但通常会显着降低免费存储分配/解除分配的频率,从而提高性能.如果您的实现std::string不支持SSO,那么std::string在堆栈上构造一个空的仍将执行自由存储分配.如果是这种情况,使用临时堆栈分配的C字符串可能对使用字符串的性能关键代码有帮助.当然,当你这样做时,你必须小心不要在脚上射击.


Phi*_*Lho 8

因为他们是如何来自众多API /库的?