协议缓冲区支持移动构造函数吗?
Does Protocol Buffers support move constructor
我已经检查了移动构造函数规格和消息构造源,但找不到一个。
如果没有,有人知道添加它的计划吗?
我正在使用 proto3
语法,编写库,并在价值vs unique_ptr之间考虑
根据https://github.com/google/protobuf/issues/2791,这将在Protobuf版本3.4.0中支持。
-
如果您尝试使用分配操作员,RVO将进行优化以防止额外的副本。
// RVO will bring the return value to a without using copy constructor. SomeMessage a = SomeFooWithMessageReturned();
-
如果要使用
std::move
将LVALUE移动到列表/子消息等。尝试使用ConcreteMessage::Swap
方法。交换项目将没有用。// Non-copy usage. somemessage.add_somerepeated_message()->Swap(&a); somemessage.mutable_somesinglar_message()->Swap(&a); // With message copying somemessage.add_somerepeated_message()->CopyFrom(a); *somemessage.mutable_somesinglar_message() = a;
从2.6.1版本开始,C Protobuf编译器仅生成复制构造函数和复制分配运算符。但是,如果您的编译器支持返回值优化(满足其条件),则不会调用复制构造函数。
您可以将一些打印语句添加到消息的复制构造仪的生成代码中,以查看它们是否真的被调用。您也可以通过编写原始插件来做到这一点,因此它可以持续到Protoc Incocations之间。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- std::vector::p ush_back() 不会在 MSVC 上编译具有已删除移动构造函数的对象
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- 为什么调用复制构造函数而不是移动构造函数?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 具有已删除移动和复制构造函数的类的就地构造
- 移动构造函数和右值引用
- 使用移动调用对等构造函数unique_ptr默认构造函数
- 为什么 std::memmove 中联合的默认非平凡移动构造函数C++?
- 具有专用化的模板类中的可靠条件复制和移动构造函数
- 构造函数采用std::string_view与std::string并移动
- C++:为什么不调用移动构造函数?
- 了解构造函数在移动、复制、赋值语义中的行为
- 没有移动的构造函数移动课程
- 引用绑定和复制构造函数/移动构造函数
- 构造函数移动
- C++ 向量实现 - 移动构造函数 - 移动与前进
- 我真的必须取消移动构造函数/移动结构中的所有成员还是只是指针
- 将类(没有默认构造函数)移动到另一个类的move构造函数中