Szybkość przypiswania elementów - vector vs for()

0

Cześć, mam do was takie pytanie:
mam taki kod:

    unsigned int size = 100000000;

    vector<double> tab1;
    vector<double> tab2;

    tab1.resize(size);
    tab2.resize(size);

    for(unsigned int i = 0; i < size; i++)
        {
        tab1[i] = rand() / RAND_MAX;
        tab2[i] = rand() / RAND_MAX;
        }

Powiedzcie mi proszę, jak to jest możliwe, że działanie typu:

vector1 = vector2;

jest szybsze (i to dość znacząco) od:

for(unsigned int i=0; i<size; i++)
   vector1[i] = vector2[i];

?
Przecież przy przypisywaniu vector i tak musi jakoś przypisać te wartości tj. i tak musi wykonać podobną (jaką?) czynność jak pętla plus dodatkowe takie, jak chociażby sprawdzenie, czy rozmiar jest taki sam (bo jeśli nie to konieczne jest utworzenie nowej tablicy)...
Z góry dzięki za wyjaśnienie.

dodanie znacznika <code class="cpp"> - fp

0

Copy on write i inne optymalizacje.

3

Nie wydaje mi się, żeby standard dopuszczał COW dla kontenerów. W sensie nie mówi tego wprost, ale wymagania są być może takie, że COW odpada. Przynajmniej tak jest dla std::string w C++11. To jest do sprawdzenia. Natomiast pewne jest, że dla typów "prostych" takie przypisanie jest wykonywane za pomocą memcpy lub memmove (lub za pomocą std::copy które się do tego sprowadza). Funkcje te są z kolei mocno optymalizowane i najczęściej wykorzystują dostępne instrukcje SIMD.

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