在编写C++应用程序时,我通常只使用特定于C++的语言特性。大多数情况下,这意味着只要有可能,就使用STL而不是CRT。
对我来说,STL比使用CRT更具流动性和可维护性。请考虑以下几点:
std::string str( "Hello" );
if( str == "Hello" ) { ... }C-Runtime的等价物是:
char const* str = "Hello";
if( strcmp( str, "Hello" ) == 0 ) { ... }就我个人而言,我发现前面的例子看起来容易多了。我只是更清楚到底发生了什么。当我编写代码的第一遍时,我的第一件事总是以最自然的方式编写代码。
我的团队对前面的例子关心的一个问题是动态分配。如果字符串是静态的,或者已经被分配到其他地方,他们认为在这里潜在地导致碎片或浪费分配是没有意义的。我反对这一点的论点是,首先以最自然的方式编写代码,然后在获得代码导致问题的证据后返回并更改它。
我不喜欢后一个例子的另一个原因是它使用了C库。通常,我不惜一切代价避免使用它,因为它不是C++,可读性较差,更容易出错,并且更具安全性风险。
所以我的问题是,我应该在C运行时避免它吗?我真的应该关心编码中这一步的额外分配吗?在这种情况下,我很难判断我是对还是错。
发布于 2012-05-24 01:52:17
我觉得我对llvm::StringRef的评论被忽略了,所以我会给出一个答案。
llvm::StringRef str("Hello");这实际上是设置一个指针,调用strlen,然后设置另一个指针。无分配。
if (str == "Hello") { do_something(); }可读,但仍然没有分配。它也适用于std::string。
std::string str("Hello");
llvm::StringRef stref(str);不过,您必须小心处理,因为如果字符串被销毁或重新分配,StringRef将变为无效。
if (str == stref) { do_something(); }我注意到在适当的地方使用这个类会带来相当大的性能好处。它是一个强大的工具,你只需要小心使用它。我发现它对字符串文字最有用,因为它们保证在程序的整个生命周期中都有效。另一个很酷的特性是,您可以在不创建新字符串的情况下获得子字符串。
顺便说一句,有一项建议是在标准库中添加一个与此类似的类。
发布于 2012-05-24 01:12:35
你在做C++还是C?它们是完全不同的语言,有着完全不同的思维方式。
如果为C++:
std::string str( "Hello" );
if( str == "Hello" ) { ... }如果C:
char const* str = "Hello";
if( strcmp( str, "Hello" ) == 0 ) { ... }不要两个都混在一起。
发布于 2012-05-24 02:19:02
使用实现Small String Optimization的编译器,我得到以下结果:
main PROC ; COMDAT
; 6 : {
$LN124:
00000 48 83 ec 48 sub rsp, 72 ; 00000048H
; 7 : std::string str( "Hello" );
00004 8b 05 00 00 00
00 mov eax, DWORD PTR ??_C@_05COLMCDPH@Hello?$AA@
; 8 :
; 9 : if( str == "Hello" )
0000a 48 8d 15 00 00
00 00 lea rdx, OFFSET FLAT:??_C@_05COLMCDPH@Hello?$AA@
00011 48 8d 4c 24 20 lea rcx, QWORD PTR str$[rsp]
00016 89 44 24 20 mov DWORD PTR str$[rsp], eax
0001a 0f b6 05 04 00
00 00 movzx eax, BYTE PTR ??_C@_05COLMCDPH@Hello?$AA@+4
00021 41 b8 05 00 00
00 mov r8d, 5
00027 c6 44 24 37 00 mov BYTE PTR str$[rsp+23], 0
0002c 48 c7 44 24 38
05 00 00 00 mov QWORD PTR str$[rsp+24], 5
00035 c6 44 24 25 00 mov BYTE PTR str$[rsp+5], 0
0003a 88 44 24 24 mov BYTE PTR str$[rsp+4], al
0003e e8 00 00 00 00 call memcmp
00043 85 c0 test eax, eax
00045 75 1d jne SHORT $LN123@main
; 10 : { printf("Yes!\n"); }
00047 48 8d 0d 00 00
00 00 lea rcx, OFFSET FLAT:??_C@_05IOIEDEHB@Yes?$CB?6?$AA@
0004e e8 00 00 00 00 call printf
; 11 :
; 12 : }看不到任何内存分配!
https://stackoverflow.com/questions/10724690
复制相似问题