gcc

2010-09-09 26 views
8

'da tailcall optimizasyonlarını nasıl devre dışı bırakırım? Kimsenin tailcall optimizasyonlarını devre dışı bırakmak için gcc için bayrağı bilmesi durumunda merak ediyorum. Temel olarak, bir tailcall optimizasyonunda, gcc çağrılan bir fonksiyondan dönüş değeri (dönüş yoluyla) geçtiğinde veya fonksiyonda başka bir şey gerçekleşmediğinde bir yığın çerçeveyi değiştirecektir. gcc

void main() { 
    foo(); 
} 

void foo() { 
    bar(); 
} 

void bar() { 
    /* at this point in code, the foo() stack frame no longer exists! */  
} 

foo bar çağırır

olan

, gcc yerine yeni bir yığın çerçeve eklemekten daha, Besin yığın çerçevesi yerine kod yayar.

Şirketimde, koddaki herhangi bir noktadan yığın izini yazdırabilen bir yığın engelleyici yok. tailcall optimizasyonu, yığın izlerini biraz karıştırabilen yığın çerçevelerinin kaybolmasını sağlar.

gcc4.3 kullanarak x86-64 için derliyorum.

Şimdiden teşekkürler! P

cevap

25

GCC manuel:

-foptimize-sibling-calls 
     Optimize sibling and tail recursive calls. 

     Enabled at levels -O2, -O3, -Os. 

Yani ya -O0/-O1 ile derlemek veya -fno-optimize-sibling-calls kullanın. Test edilmemiş

+0

salih. Teşekkürler! – pgod