Protocol Buffers是否支持移动构造函数

时间:2015-05-18 13:50:43

标签: c++ protocol-buffers protobuf-c

我已查看move constructor规范和Message constructor来源,但未找到。

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

我使用proto3语法,编写库并考虑返回值与unique_ptr。

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

  1. 如果您尝试使用赋值运算符,RVO将执行优化以防止额外的副本。

    // RVO will bring the return value to a without using copy constructor.
    SomeMessage a = SomeFooWithMessageReturned();
    
  2. 如果您想使用std::move将左值移动到列表/子消息等,请尝试使用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 :(得分:4)

从版本2.6.1开始,C ++ protobuf编译器仅生成复制构造函数和复制赋值运算符。但是如果您的编译器支持return value optimization(并且满足它的条件),则无论如何都不会调用复制构造函数。

您可以在生成的消息代码中添加一些打印语句'复制构造函数以查看它们是否真的被调用。您也可以通过编写一个protoc插件来实现它,因此它会在protoc调用之间持续存在。