RxCpp 大量调用复制构造函数
RxCpp calls copy constructor a lot
我试图在我的程序中包含 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 次,但中间没有任何运算符在起作用,并且主题只有一个订阅者。
我知道,调用复制构造函数是必要的,因为多个观察者可能正在监听并且他们不能共享移动的对象。我还希望可观察对象上的每个操作员都像另一个订阅者一样。
但是,我不明白为什么它在内部经常发生,尤其是在这个例子中。这感觉就像我做错了什么。有什么方法可以优化这个吗?如果只有一个订阅者,为什么不使用移动构造函数也有充分的理由吗?
使用 std::shared_ptr
通过 observable 发出更大的对象以避免调用复制构造函数通常是个好主意吗?
是的,rxcpp 做了很多拷贝。负担在于可以廉价复制的价值。
欢迎 PR,但必须保留允许多次调用每个 subscribe() 的现有模型。
这意味着每次调用订阅都会创建一个订阅,并且必须复制该订阅的值。
如果订阅是线程上的第一个订阅(如本例),则订阅本身会执行额外的步骤。它使用当前线程调度程序来获取线程的所有权。这很可能会将发件人复制到计划的工作中。这是可以保存一些副本的情况。
just() 本身可能会使用指定的调度程序 arg 安排对 on_next 的调用,在这种情况下,它默认为当前线程调度程序,并带有该值的另一个副本。
我试图在我的程序中包含 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 次,但中间没有任何运算符在起作用,并且主题只有一个订阅者。
我知道,调用复制构造函数是必要的,因为多个观察者可能正在监听并且他们不能共享移动的对象。我还希望可观察对象上的每个操作员都像另一个订阅者一样。
但是,我不明白为什么它在内部经常发生,尤其是在这个例子中。这感觉就像我做错了什么。有什么方法可以优化这个吗?如果只有一个订阅者,为什么不使用移动构造函数也有充分的理由吗?
使用 std::shared_ptr
通过 observable 发出更大的对象以避免调用复制构造函数通常是个好主意吗?
是的,rxcpp 做了很多拷贝。负担在于可以廉价复制的价值。
欢迎 PR,但必须保留允许多次调用每个 subscribe() 的现有模型。
这意味着每次调用订阅都会创建一个订阅,并且必须复制该订阅的值。
如果订阅是线程上的第一个订阅(如本例),则订阅本身会执行额外的步骤。它使用当前线程调度程序来获取线程的所有权。这很可能会将发件人复制到计划的工作中。这是可以保存一些副本的情况。
just() 本身可能会使用指定的调度程序 arg 安排对 on_next 的调用,在这种情况下,它默认为当前线程调度程序,并带有该值的另一个副本。