2015-02-02 35 views
5

Jeśli przyjmę adres std::vector, a po wprowadzeniu elementów ponownie się przydzieli, czy mogę założyć, że jego adres się nie zmienia?Adres std :: vector sam stable?

Dzięki.

+6

Adres wektora nie zmieni się. Adres poszczególnych elementów, nie tyle. – AndyG

+3

Adres konkretnego obiektu nigdy się nie zmienia! –

+0

@NeilKirk Z wyjątkiem konkretnych obiektów w wektorze lub jakiegokolwiek innego pojemnika ... – Suedocode

Odpowiedz

8

Tak, w C++ możesz bezpiecznie to założyć. Jednak adres pierwszego elementu może zmienić się, te adresy nie są takie same. Edycja: To samo dotyczy adresów innych elementów, oczywiście.


Nawiasem mówiąc, czy adres pierwszego elementu prawdopodobnie pozostanie mniej lub bardziej stabilny zależy whether or not the growth factor of the array is less than the golden ratio, co jest naprawdę fajne fakt wiedzieć IMO.

+0

_ "adres pierwszego elementu' & x [0] 'może się zmienić" _ Co z '& x [5]'? Czy to się nie zmieni (również unieważnienie z powodu realokacji)? –

+0

@ πάνταῥεῖ Zakładam, że OP jest na tyle sprytny, aby uzyskać go przez domniemanie. –

+0

Prawdziwa odpowiedź to tylko tyknięcie szersze. Ale nieważne, złapałeś sprawę. –

3

Jeśli biorę adresu std::vector, a po włożeniu go ponownie rozmieszcza elementy, mogę założyć, jego adres nie zmienia?

Można rzeczywiście zawsze Zakładamy, że adres pewnej zmiennej nie ulegnie zmianie, ze względu na wywołanie dowolnego zachowanie to (nie jest to możliwe, ponieważ składnia języka uniemożliwia to. Nie można po prostu zastąpić this z dowolna wartość).

Realokacja jest zachowanie std::vector, że dotyczy to podstawowe struktury danych (mianowicie std::vector::data()), a wskaźniki pochodzące z tych przeciążeń są niestabilne dotyczące tego zachowania i mogą ulec zmianie (tak samo dla innych adresów z przesunięciami pobrane np od ptr = &myVector[5];).

+0

"to niemożliwe, ponieważ składnia języka to uniemożliwia" - nie jest to prawdą, istnieją biblioteki GC dla C++, które nie wymagają specjalnych klas inteligentnych wskaźników lub dodatków do składni, a generalnie nie można zagwarantować czegoś takiego za pomocą składni sam. Nie wiem, czy ten, z którym się łączę, robi realokację lub po prostu zaznacza i zmiata, ale w zasadzie nic nie powstrzymuje GC przed przejęciem programu, a następnie przejściem do stosu zmieniającego wartości wskaźnika, wszystko zależy od implementacji i może zmuszenie kompana do współpracy. http://www.hboehm.info/gc/simple_example.html –

+0

@AlexeiAverchenko Nie widzę, w jaki sposób byłby on w stanie zastąpić wskaźnik 'this' dowolnie przez' nullptr' lub inną instancję (ale tylko odtłuszczone) . W każdym razie, jeżeli te szczególne przypadki są istotne dla PO, można argumentować. –

+2

Moim celem jest składnia C++, która nie gwarantuje pewnych wartości zmiennych, takie gwarancje z natury rzeczy dotyczą semantyki języka. –

Powiązane problemy