C++ Primer说
对于大多数应用程序来说,除了更安全之外,使用库字符串也比使用C风格字符串更有效。
安全是可以理解的。为什么C++字符串库更高效?毕竟,在它的下面,字符串不是仍然表示为字符数组吗?
为了澄清,作者是谈论程序员效率(理解)还是处理效率?
发布于 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 memmem比strstr快一倍的原因。我做了子字符串算法的很多标杆。
这不仅适用于子字符串搜索算法。对于以零结尾的字符串,许多其他字符串处理算法都比较慢。
发布于 2012-08-25 17:59:15
为什么C++字符串库更高效?毕竟,在它的下面,字符串不是仍然表示为字符数组吗?
因为如果不仔细编写,使用char*或char[]的代码更有可能无效。例如,您是否见过这样的循环:
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,许多这样的优化都是由类本身完成的。所以你可以这样写:
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周期方面有效,而且还提高了程序员的效率!
发布于 2012-08-25 18:05:05
std::string知道它的长度,这使得许多操作更快。
例如,考虑到:
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每次增长时都会分配额外的空间,这意味着以后的追加操作不需要重新分配。
https://stackoverflow.com/questions/12124263
复制相似问题