1) bir DLL işlevini çağırmanın her zaman ekstra bir dolaylı atlama kullanmasına dayanır. Bugün, bu genellikle önemsizdir. DLL içinde i386 CPU'larda biraz daha fazla yük var, çünkü konumdan bağımsız kod üretemiyorlar. AMD64'te, atlamalar program sayacına göre olabilir, bu nedenle bu büyük bir gelişmedir.
2) Bu doğru. Profillemenin yönlendirdiği optimizasyonlarla genellikle yüzde 10-15 oranında performans kazanabilirsiniz. Şimdi CPU hızı sınırlarına ulaştığına göre buna değebilir.
Şunu ekleyeceğim: (3) bağlayıcı daha önbellek etkin bir gruplama fonksiyonlarını düzenleyebilir, böylece pahalı önbellek seviyesi özlüyor minimize edilir. Ayrıca özellikle uygulamaların başlangıç zamanını etkileyebilir (Sun C ++ derleyicisiyle gördüğüm sonuçlara dayanarak)
Ve DLL'lerde ölü kod ortadan kaldırmanın yapılamayacağını unutmayın. Dile bağlı olarak, DLL kodu da uygun olmayabilir. Derleyici bir istemcinin üzerine yazıp yazmadığını bilmediği için sanal işlevler her zaman sanaldır.
Bu nedenlerle, DLL'lere gerçek bir ihtiyaç yoksa, sadece statik derleme kullanın.
EDIT (yorumu kullanıcı alt çizgisine göre cevaplamak için)
Pozisyon bağımsız kod sorunu hakkında iyi bir kaynak http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
Açıklandığı gibi x86 onları başka bir şey için AFAIK yok sonra 15 bit atlama aralıkları ve koşulsuz atlama ve aramalar için değil. Bu yüzden 32K'dan daha fazla olan fonksiyonlar (jeneratörlerden) her zaman bir sorun olmuştur ve gömülü trambolinlere ihtiyaç duymuştur.
Ancak Linux gibi popüler x86 işletim sistemlerinde .so / DLL dosyasının gcc
anahtarla oluşturulmadığına -fpic
(dolaylı atlama tablolarının kullanılmasını zorunlu kılan) dikkat etmeniz gerekmez . Çünkü bunu yapmazsanız, kod normal bir bağlayıcının yerini değiştireceği gibi sabitlenir. Ancak bunu yaparken, kod segmentini paylaşılamaz hale getirir ve kodun diskten belleğe tam olarak eşlenmesi ve kullanılmadan önce hepsine dokunması gerekir (önbelleklerin çoğunu boşaltmak, TLB'leri vurmak) vb. bu yavaş kabul edildiğinde.
Yani artık bir faydası olmazdı.
Ben OS (Solaris veya FreeBSD) Ben sadece yapmıyorum çünkü benim Unix yapı sistemi ile bana sorun verdi ve ben de başvurdum kadar yüzden kaza merak neyi hatırlamıyorum -fPIC
için gcc
.