2013-07-29 2 views
1

Предположим, у меня есть какой-то предмет, например:C++ справочник против локальной переменной

std::map<int, std::vector<double> > some_map; 

Простой вопрос: является ли это более эффективно, чтобы сделать следующее

std::vector<double> vec = some_map[some_index]; 

или ссылки на его

std::vector<double>& vec = some_map[some_index]; 

Может кто-нибудь объяснить короче, что обычно происходит за кулисами здесь?

Большое спасибо!

ответ

7

Эти два варианта имеют разную семантику и не являются взаимозаменяемыми. Первый дает вам копию, которую вы можете изменить, но вы не можете ничего, ничего не меняя на карте, . Второй дает ссылку на элемент данных на карте; любые модификации изменяют содержимое карты. Кроме того, хотя , вероятно, не проблема, имейте в виду, что если карта разрушена до того, как ссылка выходит за пределы области, ссылка будет болтаться.

Что касается производительности, это зависит от того, что находится в векторе, и что вы будете делать с ним позже; в большинстве случаев ссылка будет , вероятно, имеет лучшую производительность, но вы не должны беспокоиться об этом , пока профайлер не скажет, что вам нужно. (А если использовать ссылки, сделать его const, если вы действительно хотите, чтобы иметь возможность изменить содержимое карты.)

4

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

Если вы

std::vector<double> vec = some_map[some_index]; 

Копия конструктор std::vector называется скопировать весь вектор some_map[some_index] в vec. Таким образом, вы получаете новый новый вектор vec. Они являются независимыми объектами, и любые изменения в vec не влияют на исходную карту.

Если вы используете

std::vector<double>& vec = some_map[some_index]; 

затем vec относится непосредственно к some_map[some_index] и копия избежать. Однако имейте в виду, что если вы позже измените vec, изменение будет отражено как в vec, так и в some_map[some_index], поскольку они относятся к одному и тому же объекту. Для предотвращения нежелательных изменений, безопаснее использовать константную ссылку:

const std::vector<double>& vec = some_map[some_index]; 
+1

Различие в семантике, вероятно, более важно, чем какая-либо разница в производительности. –

+0

2 Различные реализации имеют две разные цели: объявление переменной по значению позволяет вам изменять переменную без риска изменения исходного значения. – Subhajit

1

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

+0

Спасибо, Джеймс был немного быстрее :-) –

Смежные вопросы