gpt4 book ai didi

C++11 传递 POD 类型的值比 const 引用差

转载 作者:行者123 更新时间:2023-11-27 23:52:52 28 4
gpt4 key购买 nike

这个问题不是关于按值或引用传递大对象——也不是关于移动语义——就像许多其他问题一样。

我想知道 POD 类型必须有多小,以便按值而不是常量引用传递它是更好的主意。我写了下面的代码:

#include <ctime>
#include <iostream>
#include <complex>

using namespace std;

using Number = double; //complex<double>;

struct acc {
Number a;
void f(const Number& x) { a += x; }
void g(Number x) { a += x; }
};

int main()
{
int n = 1000000000;
Number *v = new Number[n];

for (int i = 0; i < n; i++) {
v[i] = Number(i);
}

clock_t b, e;
acc foo;

#ifdef _const
b = clock();
for (int i = 0; i < n; i++)
foo.f(v[i]);

e = clock();

cout << ((double) e - b) / CLOCKS_PER_SEC << endl;
#else
b = clock();
for (int i = 0; i < n; i++)
foo.g(v[i]);

e = clock();

cout << ((double) e - b) / CLOCKS_PER_SEC << endl;
#endif

cout << foo.a << endl;

return 0;
}

我用 gcc 编译,没有优化。

当使用 Number = complex 时,const 引用更快,我有点预料到这一点。但是当使用 Number = double 时,通过 const 引用传递也更快,这完全让我感到惊讶(在我的计算机中,传递值是 3.5,const 引用是 2.9)。

这是为什么?这么简单的例子,包括访问内存在内的工作量不都一样吗?我必须编写一个模板库,我想小心使用 const 引用或根据模板参数的大小传递值,但现在我认为担心这个是没有用的。其他人知道发生了什么事吗?

如果我使用优化进行编译,那么这两种变体的运行速度都一样快。

最佳答案

编译器编写者不关心你未优化的玩具代码在一个类似的情况下是否比另一个慢 20%。这就是为什么。

你也不应该,除非你处于极端的极端情况下,你需要你的调试构建足够快以满足一些软实时要求(比如,每隔 X Hz 完成一次渲染,或者在另一端之前处理数据)网络连接超时),并且 20% 的减速在关键路径上。

关于C++11 传递 POD 类型的值比 const 引用差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45020576/

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