9

我检查了移动构造函数规范和消息构造函数源,但没有找到。

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

我正在使用proto3语法,编写一个库并考虑通过 value 与 unique_ptr 之间的返回。

4

3 回答 3

10

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

于 2017-08-11T17:33:53.260 回答
9
  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;
    
于 2015-10-27T10:44:22.750 回答
4

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

您可以将一些打印语句添加到消息的复制构造函数的生成代码中,以查看它们是否真的被调用。您也可以通过编写一个 protoc 插件来做到这一点,因此它在 protoc 调用之间保持不变。

于 2015-05-18T15:22:36.177 回答