c++ - C vs C++ 性能(用于处理短字符串)

标签 c++

编辑

我的测试结果是here .尽管有人坚持认为我的测试完全错误,C++C 慢 110% ;(


最近,Bjarne Stroustrup 写了 Five Popular Myths about C++

在他的文章中,他用C和C++实现了一个函数

C++ 版本

string compose(const string& name, const string& domain)
{
  return name+'@'+domain;
}

C 版

char* compose(const char* name, const char* domain)
{
  char* res = malloc(strlen(name)+strlen(domain)+2); // space for strings, '@', and 0
  char* p = strcpy(res,name);
p += strlen(name);
  *p = '@';
  strcpy(p+1,domain);
  return res;
}

最后他提到:

which version is likely to be the most efficient? Yes, the C++ version, because it does not have to count the argument characters and does not use the free store (dynamic memory) for short argument strings.

这样对吗?尽管 C++ 版本比 C 版本短,但我认为 std::stringoperator+() 将类似于 C 版本

最佳答案

至少在某些情况下,是的,C++ 版本会快得多。

特别是,std::string 的某些实现包括通常所说的“短字符串优化”(又名“SSO”)。这样一来,std::string 对象本身就包含了一个字符串的空间,最多可以达到某个特定的限制(通常大约 20 个字符)。适合该缓冲区的字符串可以(并且将会)避免在堆/空闲存储上分配空间来存储它们的数据。

理论上,您可以做与 C 大致相同的事情——但是当/如果您这样做,您必须定义自己的结构来保存您的字符串(很像 C++ 所做的)并且 操纵这些字符串结构的每一段代码都需要知道它们是如何工作的,并以相同的方式操纵它们。 C++ 可以轻松地将代码包装到运算符重载中以隐藏细节。

底线是 C 可以理论上跟上,但要做到这一点就需要做更多的工作,因为在实践中需要在 C++ 中进行这种操作的程序几乎总是更快与用 C 语言编写的同行相比。几乎所有不同的是它们运行的​​速度——有时它们只快一点,但尤其是在对相对较小的字符串进行大量操作的情况下,大量差异(例如 2:1 或更多)很常见。当您需要操作非常大的字符串时,差异也可能非常大,其中 C++ 通过能够在常数时间内找到大小而获得很多,其中 strlen 需要线性时间。对于小到足以完全放入 L1 缓存的字符串,这意义不大,但是如果您可以从 L1 读取一个值与从主内存读取整个字符串,则差异可能很大。

关于c++ - C vs C++ 性能(用于处理短字符串),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27630523/

相关文章:

c++ - 在Visual Studio 19中无法识别ofstream和ifstream的错误

c++ - 为什么数组大小初始化在类/结构/...内部或外部不同?

c++ - 捕获标准输出到 zip 并使用 CTRL-C 中断会产生损坏的 zip 文件

c++ - 从使用 numpy.save(...) 保存的文件中将 numpy 数组加载到 C 中

c++ - 使用 CMAKE 构建和安装静态库

C++:ofstream 类将文件保存到哪里?

c++ - TCL 库从 C++ 函数返回一个字符串

c++ - 即使>>和getline都获取null输出,即使我正在使用字符串空白

c++ - 在C++中使用cuda进行颜色空间转换

c++ - 找不到 LMDB(缺少 : LMDB_INCLUDE_DIR LMDB_LIBRARIES)