Как эффективно вставить пару в std :: vector? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть std::vector<std::pair<...>> и я хочу эффективно изменить их:

vector<pair<int, int>> vec;
vec.emplace_back(4, 5);
vec.emplace_back(6, 7);

// Now I want to set the first pair in the vector.
vec[0] = make_pair(10, 10);

Насколько я понимаю, у нас есть

  1. Временная пара построена из make_pair.Для этого требуется 2 копии int с.
  2. Далее вызывается pair<int,int>& operator=( pair<int,int>&& other ), что вызывает std::move на двух int с в pair.Это займет 2 копии int с.

В результате мы получим 4 копии целых чисел!

Но модификация pair в Vector должна занять 2 копииint с.emplace_back мне кажется, что мне нужно, но он создает конструкцию на месте только в конце вектора, а не по любому другому индексу.

Конечно, я могу сделать

vec[0].first = 10;
vec[0].second = 10;

Но это принимает во внимание внутренности пары, которые я хочу опустить.

Как я могу написать код более эффективно (без избыточных копий int с)?

1 Ответ

0 голосов
/ 20 октября 2018

Включите оптимизацию компилятора и вот, они точно такие же: https://godbolt.org/z/Nwb_y0

Сборка, сгенерированная GCC 8:

    mov     rax, QWORD PTR [rdi]
    mov     DWORD PTR [rax], esi
    mov     DWORD PTR [rax+4], edx

Как видите, целые числа сохраняютсятолько один раз лишней копии нет.

Если вы компилируете с -O1 вместо -O2 или -O3, код на самом деле хуже для «более простой» версии без make_pair: он загружаетсяадрес из вектора в два раза.Таким образом, версия make_pair лучше на -O1 и идентична на более высоких уровнях оптимизации.

...