1) didasarkan pada fakta bahwa memanggil fungsi DLL selalu menggunakan lompatan tidak langsung tambahan. Hari ini, ini biasanya diabaikan. Di dalam DLL ada beberapa overhead pada CPU i386, karena mereka tidak dapat menghasilkan kode posisi independen. Pada amd64, lompatan bisa relatif terhadap penghitung program, jadi ini merupakan peningkatan besar.
2) Ini benar. Dengan optimasi yang dipandu oleh profil, Anda biasanya dapat memenangkan sekitar 10-15 persen kinerja. Sekarang kecepatan CPU telah mencapai batasnya, mungkin layak untuk dilakukan.
Saya akan menambahkan: (3) linker dapat mengatur fungsi dalam pengelompokan yang lebih efisien cache, sehingga tingkat cache yang mahal diabaikan. Ini juga mungkin sangat mempengaruhi waktu startup aplikasi (berdasarkan hasil yang saya lihat dengan kompiler Sun C ++)
Dan jangan lupa bahwa dengan DLL tidak ada penghapusan kode mati yang dapat dilakukan. Bergantung pada bahasanya, kode DLL mungkin juga tidak optimal. Fungsi virtual selalu virtual karena kompiler tidak tahu apakah klien menimpanya.
Untuk alasan ini, jika tidak ada kebutuhan nyata untuk DLL, maka gunakan saja kompilasi statis.
EDIT (untuk menjawab komentar, dengan garis bawah pengguna)
Berikut ini adalah sumber yang bagus tentang masalah kode posisi independen http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-share-libraries/
Sebagaimana dijelaskan x86 tidak memilikinya AFAIK untuk hal lain selain rentang lompat 15 bit dan tidak untuk lompatan dan panggilan tanpa syarat. Itu sebabnya fungsi (dari generator) yang memiliki lebih dari 32 ribu selalu menjadi masalah dan membutuhkan trampolin yang disematkan.
Tetapi pada OS x86 populer seperti Linux Anda tidak perlu peduli jika file .so / DLL tidak dihasilkan dengan gcc
switch -fpic
(yang memberlakukan penggunaan tabel lompat tidak langsung). Karena jika Anda tidak melakukannya, kode itu hanya diperbaiki seperti penghubung biasa akan memindahkannya. Tetapi ketika melakukan ini membuat segmen kode tidak dapat dibagikan dan akan membutuhkan pemetaan penuh kode dari disk ke memori dan menyentuhnya semua sebelum dapat digunakan (mengosongkan sebagian besar cache, memukul TLB) dll. Ada waktu saat ini dianggap lambat.
Jadi Anda tidak akan mendapat manfaat lagi.
Saya tidak ingat apa OS (Solaris atau FreeBSD) memberi saya masalah dengan saya Unix membangun sistem karena saya hanya tidak melakukan hal ini dan bertanya-tanya mengapa jatuh sampai saya diterapkan -fPIC
untuk gcc
.