Как я могу предотвратить копирование объектов излучения?

StackOverflow https://stackoverflow.com//questions/9620077

  •  09-12-2019
  •  | 
  •  

Вопрос

Я учусь с помощью key_value flyweigs, и я написал следующий код:

#include <iostream>
#include <string>
#include <boost/flyweight.hpp>
#include <boost/flyweight/key_value.hpp>
#include <boost/flyweight/no_locking.hpp>

class Foo
{
    std::string name_;
public:
    Foo(const std::string& name) { name_ = name; std::cout << "created " << name << "\n"; }
    Foo(const Foo& f) { name_ = f.name_; std::cout << "Copied\n"; }
    ~Foo() {std::cout << "Destroyed " << name_ << "\n"; }
};

typedef boost::flyweight< boost::flyweights::key_value<std::string, Foo >,  boost::flyweights::no_locking > FooLoader;

int main()
{
{
    Foo myF = FooLoader("bar");
}
}
.

Когда я бегу, я получил всплывающую выход:

created bar
Copied
Destroyed bar
Destroyed bar
.

Я хотел бы избежать дополнительной копии, так как мой настоящий Foo довольно дорогой для копирования.Это также основная причина, по которой я использую избаланщую вес.Итак, есть ли способ избежать дополнительной копии?

Это было полезно?

Решение

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

А особенно с C ++ 11, вы почти никогда не беспокоитесь об этом, так как он ввел шаг-семантику, которые не стоят вам больше, даже если некоторые временные объекты создаются на лету в шаблоне излучения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top