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?
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?
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