Поддерживает ли протокол буфера конструктор перемещения

Я проверил переместить конструктор спецификация и Конструктор сообщений Источник так и не нашел.

Если нет, кто-нибудь знает о плане, чтобы добавить его?

я использую proto3 синтаксис, написание библиотеки и рассмотрение между возвратом через значение против unique_ptr.

7

Решение

Начиная с версии 2.6.1, компилятор protobuf C ++ генерирует только конструкторы копирования и операторы назначения копирования. Но если ваш компилятор поддерживает оптимизация возвращаемого значения (и условия для этого соблюдены) конструктор копирования не будет вызван в любом случае.

Вы можете добавить некоторые операторы печати в сгенерированный код конструкторов копирования ваших сообщений, чтобы увидеть, действительно ли они вызваны или нет. Вы также можете сделать это, написав плагин Protoc, чтобы он сохранялся между вызовами Protoc.

4

Другие решения

В соответствии с https://github.com/google/protobuf/issues/2791 это будет поддерживаться в версии Protobuf 3.4.0.

7

  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;
    
6
По вопросам рекламы [email protected]