2010-03-16 16 views
6

Sürüm oluşturma işlemleri için -finline işlevleri optimizasyonu ile gcc kullanıyorum. Kod bloat ile mücadele etmek için gömülü bir sistem üzerinde çalıştığım için söylemek istiyorum ki belirli işlevleri inline etmeyin. Bunu yapmanın bariz yolu, özniteliği (noinline) gibi işlev öznitelikleri yoluyla olur. Sorun şu ki, -O3 anahtarının bir parçası olan global -finline-function optimizasyonunu açtığımda işe yaramıyor.gcc -finline-functions davranışı?

Ayrıca, aynı işlevin templated olmayan bir sürümü beklendiği gibi satır içi alınıp alınmadığından, şablonla işlenmesi gereken bir şey de vardır.

Bu global anahtar açıkken, inlinasyonu nasıl kontrol edeceğine dair herhangi bir fikri var mı?

#include <cstdlib> 
#include <iostream> 

using namespace std; 

class Base 
{ 
public: 

    template<typename _Type_> 
    static _Type_ fooT(_Type_ x, _Type_ y) __attribute__ ((noinline)); 
}; 

template<typename _Type_> 
_Type_ Base::fooT(_Type_ x, _Type_ y) 
{ 
    asm(""); 
    return x + y; 
} 


int main(int argc, char *argv[]) 
{ 
    int test = Base::fooT(1, 2); 
    printf("test = %d\n", test); 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
+1

İlgili değil, ancak altyazı ile başlayan tanımlayıcılar büyük harfle takip edilir ve derleyici için ayrılır. – GManNickG

+0

__attribute __ ((noinline)) tanımına eklenmemeli mi? – jpalecek

+0

@jpalecek: Bu bir derleme hatası yok – user176168

cevap

4

docs for GCC's noinline ki::

Bu fonksiyon nitelik inlining için düşünülen bir işlev engelleyen

İşte kod. Fonksiyonun yan etkileri yoksa, işlev çağrısı canlı olmasına rağmen, işlev çağrılarının en iyi duruma getirilmesine neden olan satır içi dışında optimizasyonlar vardır. uzağa optimize edilen bu tür aramaları tutmak için,

Ben sana ne oluyor olabileceğini düşünmek özel yan etki olarak hizmet etmek, denilen işlevinde

 asm (""); 

(bkz Asm Extended) koymak Base::fooT<> işlevinin hiçbir yan etkisi olmadığından, GCC yukarıda belirtilen belirtilmemiş diğer optimizasyonları çağırıyordur.

+0

Cevap vermekte gecikme için üzgünüm! Ne yazık ki gcc hala inline, bunu daha önce denedim. 4.1.1 kullanıyorum, bununla ilgili bir hata olduğunu bilen var mı? Cevabınız için teşekkürler, ancak bu konu hakkında orada bir sürü bilgi var gibi görünmüyor ... – user176168

1

static sonra şöyle tanım önce noinline niteliğini koyarak deneyin:

template<typename _Type_> 
    static __attribute__ ((noinline)) _Type_ fooT(_Type_ x, _Type_ y); 

Bu benim için çalıştı ve çok başkaları için çalışmak gibi, bakınız: How can I tell gcc not to inline a function?

Götürmezse Nedense İşlevden sonra noinline özniteliğini koyarak veya gcc belgelerinin ne söylediğine rağmen işlev gövdesine asm("")'u koyarak işe yaramayın.

1

Küçük eski iş parçacığı ama yanıtlamaya değer. Yukarıda hiçbir şey sizin için işe yaramazsa, her zaman basit bir çözüm vardır. Uygulamayı, başka bir cpp dosyasına koyarak böyle bir yöntemi kullanmak istediğiniz çeviri biriminden gizlemelisiniz. GCC> = 4.5 olarak

DÜZENLEME

fonksiyonunu uzmanlaşmış yolunda noinline yerini bir nitelik noclone yoktur.