我试图在我的程序中包含 RxCpp,我注意到,框架调用了很多发射对象的复制构造函数。
#include <iostream>
#include <rxcpp/rx.hpp>
class Foo
{
public:
Foo() = default;
Foo(Foo const &other)
{
std::cout << "Copy constructor called" << std::endl;
};
Foo(Foo &&other) noexcept
{
std::cout << "Move constructor called" << std::endl;
};
};
int main()
{
Foo bar;
rxcpp::sources::just(std::move(bar))
.subscribe(
[](Foo const &baz)
{
std::cout << "Foo received" << std::endl;
}
);
return 0;
}
运行此输出
Move constructor called
Copy constructor called
Move constructor called
Move constructor called
Move constructor called
Move constructor called
Move constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Copy constructor called
Foo received
我首先注意到这一点subject
,我想发布一个在网络操作完成后在堆栈上创建的对象。在这种情况下,复制构造函数被调用(仅?) 4 次,但中间没有操作符,主题只有一个订阅者。
我知道,调用复制构造函数是必要的,因为多个观察者可能正在监听并且他们不能共享移动的对象。我还希望 observable 上的每个运算符都像另一个订阅者一样。
但是,我不明白为什么它在内部发生了这么多,尤其是在这个例子中。这感觉就像我做错了什么。有什么办法可以优化吗?如果只有一个订阅者,是否有充分的理由不使用移动构造函数?
std::shared_ptr
通过可观察对象发出更大的对象以避免复制构造函数调用通常是一个好主意吗?