gpt4 book ai didi

c++ - 为什么存储引用而不是请求两次我的应用程序要慢得多?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:09:50 25 4
gpt4 key购买 nike

一个对象内存有一个带有签名的方法

BinaryPattern const& getPattern(unsigned int index) const;

我在下面的 for 循环中使用它:

for (unsigned int k = 0; k < memory->size(); k++) {
const BinaryPattern s = memory->getPattern(k);
w += s.at(i) * s.at(j);
}

这很慢。令人惊讶的是,我发现下面的速度要快得多:

for (unsigned int k = 0; k < memory->size(); k++) {
w += memory->getPattern(k).at(i) * memory->getPattern(k).at(j);
}

“getPattern()”不做任何计算,它几乎只是返回存储在 vector 中的模式。

当我将引用存储在变量中时,为什么会慢很多?我最初这样做是为了加快速度,因为我预计检索引用两次会更慢。

最佳答案

因为

const BinaryPattern s = memory->getPattern(k);

通过调用其复制构造函数制作对象的拷贝。由于您不想更改它,因此存储一个引用:

const BinaryPattern& s = memory->getPattern(k);
// ^
// note this

(由于使用 const 引用捕获右值会延长右值的生命周期,直到引用终止,如果 getPattern() 的签名被更改为返回,这甚至可以工作拷贝,而不是引用。)


在优化构建中(你没有比较调试构建,是吗?),编译器可能能够确定对函数的两次调用

memory->getPattern(k).at(i) * memory->getPattern(k).at(j)

没有任何副作用,因此保留了对第一次调用获得的对象的引用并优化了第二次调用——得到我上面建议的代码。

显然,复制 BinaryPattern 对象的成本不可忽略。

关于c++ - 为什么存储引用而不是请求两次我的应用程序要慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970087/

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