c++ - 为什么我们需要传递 const 共享指针作为引用?
问题描述
在阅读开源代码时,我发现以下内容以两种不同的方式将共享指针传递给函数。
class A{A();};
typedef std::shared_ptr<A> A_Ptr;
void func1(A_Ptr a);
void func2( const A_Ptr& a);
使用 const 时将其作为参考传递的原因是什么?我了解 func2 的编写者并不希望该函数能够更改 a 中的任何内容。但是我们不能这样做const A_Ptr a
吗?另外,我们不应该A_Ptr & a
在 func1 中传递它的原因是什么?
代码中出现上述情况:
Git:https ://github.com/uzh-rpg/rpg_svo/
无效 FrameHandlerMono::setFirstFrame(const FramePtr& first_frame)
解决方案
但是我们不能只做这个
const FramePtr
框架吗?
当然,我们可以,但随后会调用复制构造函数,这对于较大的类型(任何比内置类型大的类型)通常比通过引用传递更昂贵。这不是特定于shared_ptr
. 如果您不需要副本并且不想更改它们,通常应该默认通过 const 引用传递任何对象。只有像 int、float 或 char 这样的内置类型应该按值传递。
更有趣的是为什么要func1
使用副本。最可能的情况是他无论如何都需要一份副本,因为他想在课堂上保留一个参考。我在您发布的 github 存储库中找不到您引用的确切文件。如果仍然不清楚,请通过 func1 的函数体进入问题。
编辑:啊,我明白了。看起来他在这里按值传递的原因更多地与线程安全有关。没有阅读全文,否则shared_ptr
如果他通过 const 引用传递,则可能会被拥有线程删除。
例如在这里 func 需要按值传递,否则指针可能会被主线程删除。可能是这样的,但更复杂:
#include <chrono>
#include <iostream>
#include <memory>
#include <thread>
using namespace std::chrono_literals;
struct S {
S() {}
};
void
//This signature would be false
//func(std::shared_ptr<S> const& s)
func(std::shared_ptr<S> s)
{
std::cout << s.use_count() << '\n';
std::this_thread::sleep_for(2s);
//use_count would be 0 here if we pass by reference
std::cout << s.use_count() << '\n';
}
int
main(int argc, char**) {
std::shared_ptr<S> s{std::make_shared<S>()};
std::thread t{func, std::ref(s)};
std::this_thread::sleep_for(1s);
s.reset();
t.join();
return 0;
}
推荐阅读
- ruby-on-rails - Jelastic CMD /入口点中的bundle exec puma错误
- ruby - 如何使用数组作为值对这个散列进行排序?
- tcl - TCL:将proc的输出重定向到文件
- xml - XSLT - 克隆 XML 过滤掉数组元素
- mongodb - 我有一个包含可能值 A 和 B 的数组的文档,如何根据它将其值添加到数组中?
- javascript - 每当添加反应时,如何执行代码块?(discord.js)
- c++ - 具有互斥锁缓存的类的移动构造函数的最佳实践
- python - 美汤刮-取空集
- r - 总结一个col并将最后一个索引处的值存储在R中的一个新列中
- graph - 用于绘制逻辑门和功能块的脚本语言