2015-10-06 19 views
5

Halen standart kütüphanede tahsis fonksiyonları gibi const referans olarak std::nothrow_t almak: std::nothrow_t yanaNeden ayırma işlevleri std :: nothrow_t değerini değer yerine değil alır?

void* operator new (std::size_t count, const std::nothrow_t& tag); 
void* operator new[](std::size_t count, const std::nothrow_t& tag); 

basitçe sevk amaçlı bir etiket türüdür değildir basit ve (muhtemelen) tarafından götürün daha verimli değeri? Örneğin:

Yapı referans tasarımının ardındaki mantık nedir?

+1

Muhtemelen hiçbir kopya kurucusunun çağrılması gerekmiyor. – CoffeeandCode

+1

@CoffeeandCode Etiket türlerinin kopyalanmasının önemsiz ve hızlı olduğunu ve derleyici optimizasyonuna bağlı olduğunu düşünüyorum. – Lingxi

+0

Ancak, bunların uygulanması çoğu zaman birinin türünü somutlaştırmasını zorlaştırır. – CoffeeandCode

cevap

5

new'un bu sürümünün normal kullanımı new(nothrow_t()) T olarak adlandırılacaksa, iyi bir noktaya sahip olursunuz. Ancak bu tipik kullanım değildir, tipik kullanım new(nothrow) T, nothrowextern const std::nothrow_t nothrow; olarak bildirilmiştir. nothrow_t türünde hiçbir gerçek veri olmamasına rağmen, yine de (en azından) bir bayt alır ve birçok ABI'de bu (0, en az) bir baytın nothrow nesnesinden okunması gerektiği anlamına gelir. operator new'a iletmek için sipariş verin. Referans olarak ele almak, sadece nesnenin adresini yüklemeyi gerektirir. Öyleyse, eğer performans farkı ölçülebilir ise, buradaki değer biçiminin daha hızlı olmasını beklemezdim.

+0

Böyle bir ABI örneğiniz var mı? Örneğin okumak için tuhaf görünüyor. boş bir struct S kopyalamak için, sadece sizeof (S) == 1. Çünkü optimizasyonlar açıksa daha fazla. –

+0

@ArneVogel Sadece 's '(s) == 1' değil, fakat eğer 'S' basitçe kopyalanabilir ise, bu kopyalama 'memcpy' eşdeğeriyle yapılabilir ve bir ABI kolayca kopyalamayı belirtebilir * olması gerekir * 'memcpy' eşdeğeriyle yapılabilir. Gerçek bir uygulama için, ABI'nin bunu gerçekten yönlendirdiğini bilmemekle birlikte, MSVC, optimizasyonlar etkin olsa bile, değeri değere aktarıyorsa boş bir yapıdan okur. – hvd

İlgili konular