Diğer yanıtların önerdiğinden daha incelikli. Nasıl bildirdiğinize bağlı olarak yığın üzerindeki veriler ile yığın üzerindeki veriler arasında mutlak bir ayrım yoktur. Örneğin:
std::vector<int> v(10);
vector
Yığın üzerinde on tamsayıdan oluşan bir (dinamik dizi) bildiren bir işlevin gövdesinde . Ancak tarafından yönetilen depolama birimi vector
yığın üzerinde değil.
Ah, ama (diğer cevaplar öneriyor) bu depolamanın ömrü vector
kendisinin yaşam süresiyle sınırlıdır , ki burada yığın tabanlı, bu yüzden nasıl uygulandığı fark etmez - onu yalnızca yığın tabanlı bir nesne olarak ele alabiliriz değer semantiği ile.
Öyle değil. İşlevin şöyle olduğunu varsayalım:
void GetSomeNumbers(std::vector<int> &result)
{
std::vector<int> v(10);
// fill v with numbers
result.swap(v);
}
Dolayısıyla, bir swap
işleve sahip herhangi bir şey (ve herhangi bir karmaşık değer türünde bir tane olmalıdır), bu verilerin tek bir sahibini garanti eden bir sistem altında bazı yığın verilere yeniden bağlanabilir bir referans olarak hizmet edebilir.
Bu nedenle, modern C ++ yaklaşımı, yığın verilerinin adresini hiçbir zaman çıplak yerel işaretçi değişkenlerinde saklamamaktır. Tüm yığın ayırmaları sınıfların içinde gizlenmelidir.
Bunu yaparsanız, programınızdaki tüm değişkenleri basit değer türleriymiş gibi düşünebilir ve yığını tamamen unutabilirsiniz (alışılmadık olması gereken bazı yığın verileri için yeni bir değer benzeri sarmalayıcı sınıfı yazmanın dışında) .
Optimize etmenize yardımcı olması için yalnızca bir özel bilgi parçasını saklamanız gerekir: mümkün olduğunda, bir değişkeni diğerine şu şekilde atamak yerine:
a = b;
onları şu şekilde değiştirin:
a.swap(b);
çünkü çok daha hızlı ve istisnalar yaratmıyor. Tek şart, b
aynı değeri tutmaya devam etmenize gerek olmamasıdır (bunun a
yerine değerini alacaktır, bu da çöpe atılacaktır a = b
).
Olumsuz yanı, bu yaklaşımın sizi gerçek dönüş değeri yerine çıktı parametreleri aracılığıyla işlevlerden değer döndürmeye zorlamasıdır. Ancak bunu C ++ 0x'de rvalue referanslarıyla düzeltiyorlar .
Hepsinden daha karmaşık durumlarda, bu fikri genel uç noktaya shared_ptr
taşır ve zaten tr1'de olduğu gibi akıllı bir işaretçi sınıfı kullanırsınız . (İhtiyacınız varsa, muhtemelen Standart C ++ 'ın tatlı uygulanabilirlik noktasının dışına çıktığınızı iddia etmeme rağmen.)