Как Clone :: clone_from может избежать ненужных выделений? - PullRequest
2 голосов
/ 05 июня 2019

Документация clone_from гласит:

Выполняет копирование из источника.

a.clone_from(&b) эквивалентен a = b.clone() по функциональности, но может быть переопределен для повторного использования ресурсов a во избежание ненужных выделений.

Почему clone_from (копирование-назначение) позволяет избежать ненужных выделений? Какой пример?

Я думаю, что это хорошо известная концепция в C ++, но у меня нет сильного фона в C ++.

1 Ответ

5 голосов
/ 05 июня 2019

Давайте возьмем, например, два вектора a и b. Каждый вектор должен выделить внутренний буфер для хранения элементов.

Вот что происходит для каждого случая:

  • a = b.clone() всегда выполняет b.clone(), который создает новый вектор со своим собственным буфером, затем a = brand_new_vector выбрасывает буфер a и крадет его из brand_new_vector.
  • a.clone_from(&b): Если буфер a слишком мал, он выделит достаточно большой буфер, но если буфер a уже достаточно большой, он скопирует каждый элемент из b непосредственно в a буфер. В последнем случае буфер a был переработан, а выделение памяти было исключено.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...