协议缓冲区支持移动构造函数吗?

Does Protocol Buffers support move constructor

本文关键字:构造函数 移动 缓冲区 支持 协议      更新时间:2023-10-16

我已经检查了移动构造函数规格和消息构造源,但找不到一个。

如果没有,有人知道添加它的计划吗?

我正在使用 proto3语法,编写库,并在价值vs unique_ptr之间考虑

根据https://github.com/google/protobuf/issues/2791,这将在Protobuf版本3.4.0中支持。

  1. 如果您尝试使用分配操作员,RVO将进行优化以防止额外的副本。

    // RVO will bring the return value to a without using copy constructor.
    SomeMessage a = SomeFooWithMessageReturned();
    
  2. 如果要使用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之间。