2015-02-02 36 views
5

Bir std::vector adresini alırsam ve öğeleri ekledikten sonra yeniden ayrılırsa, adresinin değişmediğini varsayabilir miyim?Std :: vektörünün kendisi kararlı mı?

Teşekkürler.

+6

Vektörün adresi değişmeyecek. Tek tek öğelerin adresi çok fazla değil. – AndyG

+3

Belirli bir nesnenin adresi hiçbir zaman değişmez! –

+0

@NeilKirk Vektördeki belirli nesneler veya bu konuyla ilgili başka bir kap dışında ... – Suedocode

cevap

8

Evet, C++ 'da bunu güvenle yapabilirsiniz. Bununla birlikte, &x[0]numaralı ilk elemanın adresi değiştirebilir, bu adresler aynı değildir. Düzenleme: Aynı şey, diğer öğelerin adresleri için de geçerlidir. az ya da çok kararlı kalması muhtemeldir ilk elemanın adresi olup olmadığını arada


, çok güzel bir gerçektir IMO bilmektir whether or not the growth factor of the array is less than the golden ratio bağlıdır.

+0

_ "ilk elemanın adresi & x [0]' değişebilir "_ hakkında nedir? & X [5]'? Bu değişmez mi (yeniden tahsisat nedeniyle geçersiz olur)? –

+0

@ OP τνταῥεῖ OP'nin bunu ima edecek kadar akıllı olduğunu farz ediyorum. –

+0

Gerçek cevap sadece bir kene daha geniş. Ama boşver, davayı yakaladın. –

3

std::vector adresini alırsam ve öğeleri ekledikten sonra yeniden ayrılırsa, adresinin değişmediğini varsayabilir miyim?

Sen hep belli değişkenin adresi dolayı (yani dil sözdizimi engelleyen beri. Sadece ile this yerini alamaz, mümkün değildir hiçbirini davranışını çağrılmasına, değişmez varsayalım gerçekten yapabilen keyfi bir değer).

yeniden tahsisi altta yatan veri yapıları (yani std::vector::data()), ve bu aşırı alınan işaretçileri Bu davranışa ilişkin kararsızdır ve alınan örneğin olarak uzaklıklar ile başka adresler için (aynı değişebilir için de geçerlidir std::vector bir davranış olduğunu ptr = &myVector[5];).

+0

"Bu mümkün değil, çünkü dil sözdizimi bunu engelliyor" - Bu doğru değil, C++ için özel akıllı işaretçi sınıfları veya sözdizimi eklemeleri gerektirmeyen GC kitaplıkları var ve genel olarak sözdizimi gibi bir şeyi garanti edemezsiniz yalnız. Bağımlı olduğum şey, yeniden tahsisat mı, yoksa işaretleme mi yapıyor, bilmiyorum, ama prensipte, hiç bir şey, GC'yi programın önünü durduramaz ve daha sonra yığın değiştirme işaretçi değerlerini yürümekten başka bir şey değildir. İş birliği yapmak için derleyiciyi almak. http://www.hboehm.info/gc/simple_example.html –

+0

@AlexeiAverchenko Aslında bunun, bu "nullptr" veya başka bir örnekle "this" işaretçisini nasıl değiştirebileceğini göremiyorum (ama şimdi sadece kaymış) . Her ne olursa olsun, bu özel durumlar OP için uygunsa tartışılabilir. –

+2

Benim amacım C++ sözdizimi değişkenlerin değerleri hakkında bir şeyleri garanti etmemekte, bu garantiler dilin semantiği ile doğal olarak ilgilenmektedir. –

İlgili konular