2014-11-24 30 views
7

C++ 11GCC, Clang ve Intel Compiler'da tek bir makroyla satır içi zorlanıyor musunuz?

'da sıkı bir döngüye gerek duyduğum bir işlev var. Bu işlevin, başlıktan ayrı bir dosyada uygulanmasını istiyorum ve yine de, kullanılmakta olduğu her yerde satır içine alınmaya zorlanmasını istiyorum. Ayrıca, hem clang, GCC hem de Intel derleyicisi ile derlemek istiyorum. Gereksinimi ortadan kaldırmak için

.

#define force_inline <something here> 
başlıklarında

:

force_inline void foo(); 

Ve uygulama dosyasında bunu yapmak mümkün olmalıdır:

void foo() {... Code.. } 
Bana böyle bir şey yapmak izin verecek bir makro arıyorum

Sadece açık olmak gerekirse, kodları başlıklarıma koymak istemiyorum. Sadece işlevin bildirimini içermelerini istiyorum.

Tüm bu derleyiciler üzerinde çalışan bir makro ile satır içi elde etmenin bir yolu var mı?

var bugüne kadar en iyi çözüm bu makro geçerli:

#define forceinline inline __attribute__((always-inline)) 

ICC ihtiyacı olduğunu görünüyor inlining garanti etmek ve başlıkta tam olarak uygulanmasını (kod inlining ile ilgisi yoktur) hem inline fonksiyonun

Not: Evet, performansımı ölçtüm ve işlevinin satır içi karakterden daha hızlı olduğunu bildiğimi biliyorum. Ve hayır, derleyici benim için yapmaz.

+1

"gcc -flto -O2" yi hem derlemek hem de bağlamak için kullanın. veya daha iyisi sadece başlık dosyanızda işlevinizi "statik satır içi" olarak tanımlar. –

+1

Çok fazla cevap var mı? Üç derleyicide aynı anda çalışan makroyu arıyorum. –

+0

Makrolar satır içi için kullanışlı değildir. –

cevap

1

Tanım olarak, bir satır içi işlevinin kodu (derleyici tarafından) çağrıldığı her yerde bulunur.

Derleyicinin, derleyicilerin derleme birimini oluştururken işlev koduna erişebilmesi gerektiği anlamına gelir. Bu teknik olarak mümkün, ancak kolay ve neredeyse ölçeklendirilemez. Yalnızca üstbilginizi ve bir kitaplığı dağıtırsanız, bileşeninizi kullanan derleyicinin kodu kitaplıktan alması gerektiği anlamına gelir!

Bir derleyici tarafından uygulanırsa, normal işlevler kadar üstbilgiden kodun çıkmasından yararlanamayacağınız anlamına gelir (CPP dosyasının değiştirilmesi, başlığa bağlı olarak tüm dosyaları yeniden derlemeyi gerektirir. değişme. Tek yararı, kod içermeyen bir üstbilgiye sahip olmaktır (ki bu hala iyi bir şeydir).

ben farkında

sadece mevcut çözüm nedenle clang ve icc ile çalışma ihtiyacı karşılamayan GCC bağlantı süresi optimizasyonu vardır: https://gcc.gnu.org/wiki/LinkTimeOptimization Belki de bir yönelecek belirli seçenekler olanlar derleyici için var bunu desteklemek için derleyici bağımlı kod yapmak gerekir.

Çözüm 1: Sen başlığında herhangi uygulanması olmadan "temiz sınıf" tutmak ve (ama yine de başlığı içinde) sınıf dışında satır içi fonksiyonlarını koyabiliriz. Başlıkta hala tanımlarınız var, ancak bildiriden açıkça ayrılıyor, böylece okunabilirliği azaltıyor. gerçekten başlığında sadece bildirimleri istiyorsanız 2 yerine 3 dosyalarında kodunuzu ayırmaktır, sorunu hafifletmek için başka bir yol:

Çözüm 2 (Bu benim tercih çözüm şahsen) - sadece arayüz içeren bir .h dosyası - .h dosyasında tarafından satır içi işlevleri içeren ve birlikte bir .i dosyası - kodu

kalanını içeren bir .cpp/Cc dosyası Açıkçası bu kadar çok sakıncaları da vardır senin kod şimdi iki farklı dosyada ayrılır ...

Lütfen, kaçırdığım ve bu tekliflerde gördüğünüz bir konu görürseniz bana bildirin.