首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免使用CRT

避免使用CRT
EN

Stack Overflow用户
提问于 2012-05-24 01:08:03
回答 5查看 1.4K关注 0票数 5

在编写C++应用程序时,我通常只使用特定于C++的语言特性。大多数情况下,这意味着只要有可能,就使用STL而不是CRT。

对我来说,STL比使用CRT更具流动性和可维护性。请考虑以下几点:

代码语言:javascript
复制
std::string str( "Hello" );
if( str == "Hello" ) { ... }

C-Runtime的等价物是:

代码语言:javascript
复制
char const* str = "Hello";
if( strcmp( str, "Hello" ) == 0 ) { ... }

就我个人而言,我发现前面的例子看起来容易多了。我只是更清楚到底发生了什么。当我编写代码的第一遍时,我的第一件事总是以最自然的方式编写代码。

我的团队对前面的例子关心的一个问题是动态分配。如果字符串是静态的,或者已经被分配到其他地方,他们认为在这里潜在地导致碎片或浪费分配是没有意义的。我反对这一点的论点是,首先以最自然的方式编写代码,然后在获得代码导致问题的证据后返回并更改它。

我不喜欢后一个例子的另一个原因是它使用了C库。通常,我不惜一切代价避免使用它,因为它不是C++,可读性较差,更容易出错,并且更具安全性风险。

所以我的问题是,我应该在C运行时避免它吗?我真的应该关心编码中这一步的额外分配吗?在这种情况下,我很难判断我是对还是错。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-24 01:52:17

我觉得我对llvm::StringRef的评论被忽略了,所以我会给出一个答案。

代码语言:javascript
复制
llvm::StringRef str("Hello");

这实际上是设置一个指针,调用strlen,然后设置另一个指针。无分配。

代码语言:javascript
复制
if (str == "Hello") { do_something(); }

可读,但仍然没有分配。它也适用于std::string

代码语言:javascript
复制
std::string str("Hello");
llvm::StringRef stref(str);

不过,您必须小心处理,因为如果字符串被销毁或重新分配,StringRef将变为无效。

代码语言:javascript
复制
if (str == stref) { do_something(); }

我注意到在适当的地方使用这个类会带来相当大的性能好处。它是一个强大的工具,你只需要小心使用它。我发现它对字符串文字最有用,因为它们保证在程序的整个生命周期中都有效。另一个很酷的特性是,您可以在不创建新字符串的情况下获得子字符串。

顺便说一句,有一项建议是在标准库中添加一个与此类似的类。

票数 5
EN

Stack Overflow用户

发布于 2012-05-24 01:12:35

你在做C++还是C?它们是完全不同的语言,有着完全不同的思维方式。

如果为C++:

代码语言:javascript
复制
std::string str( "Hello" );
if( str == "Hello" ) { ... }

如果C:

代码语言:javascript
复制
char const* str = "Hello";
if( strcmp( str, "Hello" ) == 0 ) { ... }

不要两个都混在一起。

票数 4
EN

Stack Overflow用户

发布于 2012-05-24 02:19:02

使用实现Small String Optimization的编译器,我得到以下结果:

代码语言:javascript
复制
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   : }

看不到任何内存分配!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10724690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档