std::make_pair - Ile obiektów jest tworzonych?

0

#include <iostream>
#include <utility>

int main() {
    std::pair<int, int> MyPair;
    for (int i=0;i<10;i++){
        MyPair = std::make_pair(i,222);
    }
    return 0;
}

Ile obiektów jest tworzonych? Jeden i jego zawartość jest stale modyfikowana czy dziesięć różnych?

2

pod wzgledem samego std::make_pair tworzy dziesiec roznych. Bo skąd std::make_pair ma wiedziec ze zostaje przypisany do tej samej zmiennej?

pod wzgledem optymalizatora, nie wiem. Wydaje mi sie ze wciaz bedzie to 10 obiektow.

Najlepiej bedzie jak skompilujesz z odpowiednimi flagami optymalizacyjnymi a pozniej skompilujesz to do asm. Wtedy odpowiedz sie pojawi. Ale pamietaj, ze to zalezy takze od kompilatora a nie tylko flag
https://stackoverflow.com/questions/137038/how-do-you-get-assembler-output-from-c-c-source-in-gcc
https://caiorss.github.io/C-Cpp-Notes/compiler-flags-options.html#org58771bf

3

@didzni:
Można spojrzeć na to na kilka sposobów:
Z perspektywy kompilatora - zero, twój program po prostu zwraca 0, resztę zbędnego kodu usuwa, patrz as-if rule.
Z perspektywy lvalue - masz jeden obiekt std::pair<int, int> MyPair;
Ale w każdej pętli wywołujesz konstruktor kopiujący MyPair = std::make_pair(i,222);, czyli de facto tworzysz nowy obiekt i umieszczasz go pod tym samym adresem.

8

Zero, bo "As-if rule" kasuje cały kod: https://godbolt.org/z/ba8nbTnYr

Zakładając, że pętla coś robi z MyPair i ponieważ od C++17 obowiązuje domyślne copy elision, to będzie istniał jeden obiekt, który będzie miał nadpisywane wartości. https://godbolt.org/z/7W5Ws5Pf6

1 użytkowników online, w tym zalogowanych: 0, gości: 1