Argüman hatırı için, farklılıkları gideren önemsiz iyimser durumlarını göz ardı edin. Ayrıca Microsoft'un Intel 64 bit çağrı kurallarını (Linux ABI'dan farklı olan) kullandığınızı varsayalım, daha sonra bu değerleri iletmek için 4 64-bit yazmaçlarınız var. Bu açıkça daha iyi.
32-bit bir uygulama için, değere ve düz bir şekilde yığının üstüne giderler. Referansa göre, bir kayıtçiye bir işaretçi konabilir (tekrar, bu tür birkaç kayıt kullanımının yığına başvurmadan önce izin verilir). Bu const referans değeri ve f2 (101) tarafından g ++ -O3 -S bir çıkış, çağrı f1 (99) 'de olabilir:
void f1(int64_t);
void f2(const int64_t&);
int main()
{
f1(99);
f2(101);
}
...
pushl 0
pushl $99
call _Z2f1x // by value - pushed two halves to stack
leal -8(%ebp), %eax
movl %eax, (%esp)
movl $101, -8(%ebp)
movl $0, -4(%ebp)
call _Z2f2RKx // by const& - ugly isn't it!?!
adlandırılan fonksiyonu daha sonra (eğer varsa, ilk kullanımdan önce almak gerekir). Çağrılan işlev, yazmaçlarda okunan değerleri önbelleğe almakta serbesttir, bu yüzden sadece bir kez gerekir. Yığın yaklaşımı ile, değer istekte yeniden okunabilir, bu nedenle kayıt için bu değer için ayrılmaya gerek yoktur. İşaretçi yaklaşımıyla, işaretçinin veya 64 bitlik değerin, başka bir iş için anlık olarak geçici olarak kaldırılması gerektiğinde, daha öngörülebilir bir yerde (örneğin, itti veya daha az kullanışlı bir kayıt) kaydedilmesi gerekebilir. int parametresi daha sonra tekrar gereklidir. Her şey, hangisinin daha hızlı olduğunu tahmin etmek zordur - CPU/register-use/optimiser/etc bağımlı olabilir ve denemeye değmez.
PST tavsiyesine A düğüm ...
Eğer her kanlı tamsayı geçirme şekli "verimlilik" :(KISS geçmek -..
pst
... gerçi bazen şablonuna KISS uygulamak Parametreler ve bazı yapıları T & yapsa bile, bazı kayıtlar bile sığabilir.
"Verimlilik" :(KISS, diğer tüm kanlı tamsayıları nasıl geçtiğini iletin –
Derleyici muhtemelen her neyse bunu iyimser olacak. –
@pst: +1 komik yorum için çok güldüm adamım –