首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C-String与C++Strings的效率

C-String与C++Strings的效率
EN

Stack Overflow用户
提问于 2012-08-25 17:44:29
回答 8查看 13.5K关注 0票数 36

C++ Primer说

对于大多数应用程序来说,除了更安全之外,使用库字符串也比使用C风格字符串更有效。

安全是可以理解的。为什么C++字符串库更高效?毕竟,在它的下面,字符串不是仍然表示为字符数组吗?

为了澄清,作者是谈论程序员效率(理解)还是处理效率?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-08-25 18:07:31

C-字符串通常更快,因为它们不调用malloc/new。但在某些情况下,std::string速度更快。函数strlen()为O(N),std::string::size()为O(1)。

此外,在搜索子字符串时,在C字符串中,您需要在每个循环中检查'\0',在std::string中不需要。在天真的子字符串搜索算法中,这并不重要,因为不需要检查'\0',而是需要检查i<s.size()。但是现代高性能的子字符串搜索算法以多字节的方式遍历字符串。每个字节都需要一个'\0'签入,这使得它们慢了下来。这就是为什么GLIBC memmemstrstr快一倍的原因。我做了子字符串算法的很多标杆

这不仅适用于子字符串搜索算法。对于以零结尾的字符串,许多其他字符串处理算法都比较慢。

票数 28
EN

Stack Overflow用户

发布于 2012-08-25 17:59:15

为什么C++字符串库更高效?毕竟,在它的下面,字符串不是仍然表示为字符数组吗?

因为如果不仔细编写,使用char*char[]的代码更有可能无效。例如,您是否见过这样的循环:

代码语言:javascript
复制
char *get_data();

char const *s = get_data(); 

for(size_t i = 0 ; i < strlen(s) ; ++i) //Is it efficent loop? No.
{
   //do something
}

这有效率吗?不是的。strlen()的时间复杂度是O(N),而且在上面的代码中,每次迭代都要计算它。

现在,您可能会说:“只要我只调用strlen()一次,就可以使其高效。”当然,你可以。但是你必须自己做所有的优化,并且要清晰地。如果你错过了什么,你就错过了CPU周期。但是使用std::string,许多这样的优化都是由类本身完成的。所以你可以这样写:

代码语言:javascript
复制
std::string get_data();

std::string const & s = get_data(); //avoid copy if you don't need  it

for(size_t i = 0 ; i < s.size() ; ++i) //Is it efficent loop? Yes.
{
   //do something
}

这有效率吗?是。size()的时间复杂度是O(1)。不需要手动优化它,这通常会使代码看起来丑陋和难以阅读。与std::string相比,使用char*生成的代码几乎总是整洁整洁的。

还请注意,std::string不仅使您的代码在CPU周期方面有效,而且还提高了程序员的效率!

票数 25
EN

Stack Overflow用户

发布于 2012-08-25 18:05:05

std::string知道它的长度,这使得许多操作更快。

例如,考虑到:

代码语言:javascript
复制
const char* c1 = "Hello, world!";
const char* c2 = "Hello, world plus dog!";
std::string s1 = c1;
std::string s2 = c2;

strlen(c1)s1.length()慢。为了进行比较,strcmp(c1, c2)必须比较几个字符以确定字符串不相等,但是s1 == s2可以分辨长度不一样,并立即返回false。

其他操作也受益于预先知道长度,例如strcat(buf, c1)必须在buf中查找空终止符以找到在何处追加数据,但是s1 += s2已经知道s1的长度,并且可以立即将新字符追加到正确的位置。

当涉及到内存管理时,std::string每次增长时都会分配额外的空间,这意味着以后的追加操作不需要重新分配。

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

https://stackoverflow.com/questions/12124263

复制
相关文章

相似问题

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