2016-11-02 22 views
8

Satır içi bir işlev için libC++ görünürlük makrosunun neden satır içi işlevlerle ilişkilendirdiği özniteliklerin bir parçası olarak __forceinline veya __attribute__((__always_inline__)) neden kullandığını anlamak isterim. arka plan için libcxx neden zaten gizli satır içi işlevlerine __forceinline veya GCC eşdeğerini uygular?

bkz:

bu inline fonksiyonlar zaten __visibility__("hidden") olarak işaretlenmiş olacak, niçin ilaveten bunları satır içi derleyicisi zorlamak için gereklidir ?

Bu konuda biraz düşündüm ve ben birkaç hipotez var, ama hiçbiri benim için tamamen tatmin edici görünüyor:

  • Bu sembol yanlışlıkla ABI parçası haline gelmez emin olmaktır. Eğer kütüphane oluşturulurken, derleyici işlevi satır içi olarak belirlemediyse, potansiyel olarak harici bir sembol ve dolayısıyla ABI'nın bir parçası olabilir. Ancak hidden özniteliği yeterli olmaz mı? Benzer şekilde, sadece kütüphaneyi kurarken fonksiyonun satır içi zorlanması gerekmez mi? Tüketiciler umurumda değil.
  • İşleç, ODR sorunlarından kaçınmak için hiçbir zaman bir tanımlamaya sahip olmamalıdır; burada derleyici, kitaplıktaki işlevin satır içi işlevini seçmemeyi seçer ve istemcinin ürettiği koddaki işlevde satır içi işlem yapmamayı seçer. kütüphane, iki farklı tanımla sonuçlandı. Ama bu visibility("hidden") kullanarak beklenen (ve kabul edilen) bir sonuç değil mi? Standart kütüphanenin bir uygulaması olarak libC++ 'ın tasarımına özgü bir şeydir.

Ben birgün ABI standardize etmek umut kendisi için bir C++ kütüphanesi oluşturmaya çalışıyorum çünkü bu sormak ve ben bir kılavuz olarak ++ libc kullanıyorum. Şimdiye kadar, iyi çalıştı, ama bu sorun bazı kafa çizilmeye neden oldu. Özellikle, MSVC'nin uyarılara yol açarak __forceinline özniteliğini kabul etmeyi reddettiğinden şikayet eden kullanıcıların raporlarını aldık. Önerilen çözümümüz, analogumuzu INLINE_VISIBILITY'ye genişletmek için, yukarıdaki ilk açıklamayı kabul ederek kütüphaneyi oluştururken sadece __forceinline (veya GCC eşdeğerini) içermelidir. Ancak

, biz __forceinline veya ilk etapta __attribute__((__always_inline__)) olmaya satır içi işlevleri zorlayarak arkasındaki mantık anlamak olduğunu tamamen emin olmadıklarından, biz bu çözümü benimsemeye biraz tereddütlü.

LibC++, gizli görünürlük olarak zaten süslenmiş olsa bile, satır içi işlevlerini satır içi zorlama gerekliliğini hissettiği için kesin bir yanıt verebilir mi?

cevap

4

Muhtemelen bunu yapan kişi olarak ele almak için en iyi pozisyondayım. Ve cevabı beğenmeyebilirsiniz. :-)

LibC++ oluştururken tek hedefim macOS'tur (OS X). Bu libC++ açık kaynaklı önce yolu oldu. Ve satır içi zorlamak için benim ana motivasyon OS sürümleri ile itti olacak dylib ABI kontrol etmekti. Zorunlu bir satır içi işlevi hiçbir zaman bir dylib'de görünmeyecektir ve bu nedenle, yalnızca bir başlıkta (OS yayınlarından farklı bir dağıtım sistemi olan) yaşayan bir şekilde yaşayabileceğime güvenebildim.

Bu kararın bir parçası olarak "gizli" ek niteliğini asla dikkate almadım çünkü bu benim için gereksiz bir komplikasyondu. Fonksiyonu bir başlıkta yaşamak istedim ve asla bir dylib'e sokulmadım ve o da buydu. Yani ilk merminin doğru olduğuna inanıyorum.

LibC++ 'nin orijinal kapsamının ötesinde büyüdüğünden heyecan duyuyorum ve bu çabaya devam etmenizi diliyorum. Sizi hedefinizde size yardımcı olabileceğim herhangi bir ek bilgi vermekten mutluluk duyuyorum.

+0

Bu cevabı iyice beğenirim ve cevap vermesi için zaman ayırdığınız için teşekkür ederim. Muhtemelen devam edip, __forceinline kargo taşımacılığımızın gereksiz olup olmadığını tekrar gözden geçirip tekrar değerlendirmemiz gerektiği gibi görünüyor. İyi olabilirmiş gibi geliyor. Ayrıca, yaklaşmakta olduğumuz yaklaşımı ya da geribildirimi almakla ilgileniyorsanız, kütüphane libmongocxx: https://github.com/mongodb/mongo-cxx-driver/tree/master – acm

İlgili konular