Makro ile satır içi bir işlev arasındaki fark, derleyicinin görmeden önce makroyla ilgilenilmesidir.
En iyileştirme bayrakları olmayan derleyicimde (clang ++), kare işlevi satır içinde olmayacak. Bu
4009f0: 55 push %rbp
4009f1: 48 89 e5 mov %rsp,%rbp
4009f4: 89 7d fc mov %edi,-0x4(%rbp)
4009f7: 8b 7d fc mov -0x4(%rbp),%edi
4009fa: 0f af 7d fc imul -0x4(%rbp),%edi
4009fe: 89 f8 mov %edi,%eax
400a00: 5d pop %rbp
400a01: c3 retq
imul işi yapan montaj talimat gibi oluşturduğu kod dinlenme etrafında veri taşınıyor görünüyor. çağıran kod
gibi
400969: e8 82 00 00 00 callq 4009f0 <_Z6squarei>
iI bunu Inline için -O3 bayrağı eklemek görünüyor ve
0000000000400a10 <main>:
400a10: 41 56 push %r14
400a12: 53 push %rbx
400a13: 50 push %rax
400a14: 48 8b 7e 08 mov 0x8(%rsi),%rdi
400a18: 31 f6 xor %esi,%esi
400a1a: ba 0a 00 00 00 mov $0xa,%edx
400a1f: e8 9c fe ff ff callq 4008c0 <[email protected]>
400a24: 48 89 c3 mov %rax,%rbx
400a27: 0f af db imul %ebx,%ebx
Bu bir olduğunu imul fonksiyonu C++ kodunda çağrılır ana işlevi gösterir Makineniz için montaj dili üzerinde temel bir tutamaç yapmak ve kaynağınızdaki gcc -S'yi kullanmak için yapmanız gereken makul bir şey ya da tam olarak ne olduğunu görmek için (burada yaptığım gibi) ikili kodunuz. Bu ne yapar:
satır içine fonksiyonunun yerine makro kullanma
0000000000400a10 <main>:
400a10: 41 56 push %r14
400a12: 53 push %rbx
400a13: 50 push %rax
400a14: 48 8b 7e 08 mov 0x8(%rsi),%rdi
400a18: 31 f6 xor %esi,%esi
400a1a: ba 0a 00 00 00 mov $0xa,%edx
400a1f: e8 9c fe ff ff callq 4008c0 <[email protected]>
400a24: 48 89 c3 mov %rax,%rbx
400a27: 0f af db imul %ebx,%ebx
Not burada makrolarıyla birçok tehlikelerden biri çok benzer bir şey alır?
x = 5; std::cout << SQUARE(++x) << std::endl;
36? hayır, 42. 6 olur
std::cout << ++x * ++x << std::endl;
olur * 7
optimizasyonu umurumda demekle insanlar tarafından ertelendi etmeyin. C veya C++ dilini kendi dilinizde kullanmak kendi başına bir optimizasyon. Sadece onunla zaman harcıyor ve mantıklı olursanız çalışmayı deneyin.
İlk önce çalıştırınız. Daha sonra hızlı çalışın. Doğruluk önemli değilse, hiçbir şey yapmayan bir işlev en hızlıdır. Genel olarak, makroların bir işlevden daha doğru olması daha zordur. Profilleme, aksi belirtilmedikçe, makro satır içi fonksiyon mikro optimizasyonu genellikle boşa harcanır. – jxh
"Makrolar metni değiştirerek çalışır" ve "Makrolar programınızı daha hızlı hale getirir" ifadesi neredeyse ilgisiz iki ifadedir. – immibis
Neredeyse bir dupe: http://stackoverflow.com/questions/1137575/inline-functions-vs-preprocessor-macros – vsoftco