在编写C++应用程序时,我通常将自己局限于C++特定的语言功能.大多数情况下,这意味着尽可能使用STL而不是CRT.
对我来说,STL比使用CRT更流畅和可维护.考虑以下:
std::string str( "Hello" );
if( str == "Hello" ) { ... }
Run Code Online (Sandbox Code Playgroud)
C-Runtime等价物将是:
char const* str = "Hello";
if( strcmp( str, "Hello" ) == 0 ) { ... }
Run Code Online (Sandbox Code Playgroud)
就个人而言,我发现前一个例子更容易看.这对我来说更清楚是怎么回事.当我写第一遍代码时,我的第一件事总是以最自然的方式编写代码.
我的团队对前一个例子的一个担忧是动态分配.如果字符串是静态的,或者已经在其他地方分配过,那么他们认为可能导致碎片或在此处浪费分配是没有意义的.我反对这一点的论点是首先以最自然的方式编写代码,然后在获得代码导致问题的证据之后返回并更改它.
我不喜欢后一个例子的另一个原因是它使用了C库.通常我会不惜一切代价避免它,因为它不是C++,它的可读性较差,更容易出错,更具安全风险.
所以我的问题是,我是否正确避免C运行时?在编码的这一步,我真的应该关心额外的分配吗?在这种情况下,我很难分辨出我是对还是错.
我觉得我的评论llvm::StringRef被忽略了,所以我会从中得出答案.
llvm::StringRef str("Hello");
Run Code Online (Sandbox Code Playgroud)
这实际上设置了一个指针,调用strlen,然后设置另一个指针.没有分配.
if (str == "Hello") { do_something(); }
Run Code Online (Sandbox Code Playgroud)
可读,但仍然没有分配.它也适用std::string.
std::string str("Hello");
llvm::StringRef stref(str);
Run Code Online (Sandbox Code Playgroud)
但是,您必须小心,因为如果字符串被销毁或重新分配,StringRef将变为无效.
if (str == stref) { do_something(); }
Run Code Online (Sandbox Code Playgroud)
在适当的地方使用此类时,我注意到了相当大的性能优势.它是一个强大的工具,你只需要小心它.我发现它对字符串文字最有用,因为它们可以保证在程序的生命周期内持续使用.另一个很酷的功能是你可以在不创建新字符串的情况下获得子字符串.
另外,有人建议将类似的类添加到标准库中.