2015-05-02 27 views
6

ilkel türde sabit referans geçen bir kayıt mı?düşünün işlev parametresi olarak aşağıdaki işlevi

+1

, yani, evet şüpheli. Ancak, uygulama harici modüllere maruz kalıyorsa, ABI gereksinimlerini karşılamalıdır - bu durumda referans bir referanstır. Genel olarak ilkellere referanslardan kaçınmak istersiniz - ve bunu yapmanın yolları vardır. – davmac

+1

Tahminimce, "T" tipi bir örnek bir kayıt defterine sığabiliyorsa, derleyici kopya ile geçecektir. Aksi takdirde, muhtemelen değişkenleri işaretçi ile geçirir. –

+1

Clang derleyici ile basit bir test yaptım. Derleyici gerçekten optimizasyonları yapıyor gibi görünüyor. Temel olarak, ABI gereksinimlerine uyan bir optimize edilmiş sürüm (işlevi satır içi veya değere göre geçirme gibi) ve bir sürümü (kullanılmayan ve yalnızca kodda oturur) oluşturur. –

cevap

0

Bu, tamamen platform ve derleyiciye bağımlıdır ve argümanların bir işleve nasıl aktarıldığıdır.
Bu özellikler programın çalıştığı sistemin ABI'sında tanımlanmıştır; Bazılarının çok sayıda kaydı vardır ve bu nedenle bunları esas olarak kullanır. Bazıları hepsini yığının üstüne itiyor. Bazıları onları N-th parametresine kadar karıştırır.

Yine, güvenemeyeceğiniz bir şeydir; Yine de birkaç şekilde kontrol edebilirsiniz. C++ dilinin bir kayıt konsepti yoktur.

2

Daha önce değinildiği gibi, optimizasyonlar derleyici ve platform bağımlıdır. Bununla birlikte, iyi bir optimizasyon derleyicisini kullanırken genellikle gün başına bir dizi optimizasyonun olmasını bekledik. Örneğin, sorunuza cevap vermek için, vb

, tahsisi kayıt bit vardiya mümkün olduğunda sürekli çarpımı ve bölünmeler dönüştürerek, fonksiyon inlining güvenebilir

misiniz Modern x86-64 derleyicileri kadar akıllı olmak Öncelik türü bir kayıt içine sığabiliyorsa, önceliği argümanını referans yerine değerle iletir?

Sadece bunu deneyeceğim.

:

template<typename T> 
T square(const T& num) { 
    return num * num; 
} 

int sq(int x) { 
    return square(x); 
} 

GCC -O3, -O2 ve -O1 güvenilir bu gerçekleştirmek için kendini gör optimizasyonu. Öte yandan, 3.5.1, Clang 3.5.1, bu optimizasyonu gerçekleştiriyor gibi görünmemektedir.

Böyle bir optimizasyonda sayılır mı? Her zaman ve kesinlikle değil - C++ standardı bunun gibi bir optimizasyonun ne zaman gerçekleşebileceği hakkında hiçbir şey söylemiyor. Pratikte, GCC kullanıyorsanız, '' un gerçekleşmesi için optimizasyonun olmasını bekleyebilirsiniz.

Böyle bir optimizasyonun gerçekleştiğinden kesinlikle emin olmak istiyorsanız, template specialization'u kullanmak isteyeceksiniz.

+1

Bu ikame işlemini gerçekleştiren optimizasyon, -fipa-sra gibi görünüyor. Clang desteklemiyor gibi görünüyor. – dyp

+0

@dyp: düzeltildi. – EyasSH

2

Derleyici, optimizasyonu yapabilir, ancak zorunlu değildir.(Değer geçirerek doğru olduğu) http://www.boost.org/doc/libs/1_55_0/libs/utility/call_traits.htm

call_traits<T>::param_type ile const T& değiştirilmesi:

"en iyi" tipi geçmek zorlamak için, destek kullanabilir.

Yani kod olabilir:

template <class T, class Priority> 
void MutableQueue<T, Priority>::update(call_traits<T>::param_type item, 
             call_traits<Priority>::param_type priority) 
{ 
    ... 
} 
İlgili konular