gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:12:26 26 4
gpt4 key购买 nike

编辑

我的测试结果是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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com