Eğer değer türleri ile C++ std :: harita (ve diğer kapları) kullanıyorsanız, harita içine yerleştirirken sizin öğe türü için yıkıcı çağırır göreceksiniz. O çiftini oluşturmak için türünüze varsayılan kurucuyu çağıranNeden C++ std :: map :: operator [] inplace yeni kullanıyor?
(*((std::map<>::insert(std::make_pair(x, T()))).first)).second
: operatör uygulanması [] Buna eşdeğer olmak C++ Spec gerektirdiği olmasıdır. Bu geçici değer daha sonra haritaya kopyalanır ve sonra imha edilir. Bu teyidi this stackoverflow post ve here on codeguru bulunabilir.
Ne garip buluyorum bu eşdeğer hala geçici değişken için gerek kalmadan uygulanabilir ve olabilir olmasıdır. C++ özelliği "inplace new" olarak adlandırılmıştır. Std :: map ve diğer kapsayıcılar, nesnenin yaşaması için boş alan tahsis edebilir ve daha sonra ayrılan alanda öğenin varsayılan yapıcısını açıkça çağırır.
Soruma Soru: Neden std :: map uygulamalarının hiçbiri, bu işlemi en iyi duruma getirmek için inplace yeni kullanımının hiçbiri yapmıyor? Bana öyle geliyor ki, bu düşük seviyedeki operasyonun performansını önemli ölçüde artıracaktır. Ancak pek çok göz STL kod tabanını çalışmış, bu yüzden bu şekilde yapılmasının bir sebebi olmalı diye düşünüyorum.
Test durumu, bağlantılı stackoverflow gönderisinde bulunur. İşte yine bağlantı: https://stackoverflow.com/questions/4017892/in-an-stl-map-of-structs-why-does-the-operator-cause-the-structs-dtor-to – srm
Mike Seymour: Öyleyse hata ayıklayıcısını kapattığında, yok ediciye yapılan bu ekstra çağrılar kaçar mı? Bunun doğru olduğunu biliyor musun? Bu doğru olsa bile, hata ayıklama ile, yürütmenin hata ayıklaması daha zor olduğu anlamına gelir (sadece "gerçek" kapsam sorunları arayan hata ayıklayıcımda bir kesme noktası ayarlayamıyorum). Daha az sorun olan, ancak yine de gerçek olan hata ayıklama sırasında daha az performans gösterir. Bu nedenlerin ikisi de, bu tür düşük seviyeli bir kütüphane için yerine yeni olanları kullanmak için nedenler olarak görünebilir. – srm