1) ขึ้นอยู่กับความจริงที่ว่าการเรียกใช้ฟังก์ชัน DLL มักจะใช้การกระโดดทางอ้อมเป็นพิเศษเสมอ วันนี้มันมักจะเล็กน้อย ภายใน DLL มีค่าใช้จ่ายเพิ่มเติมในซีพียู i386 เพราะพวกเขาไม่สามารถสร้างรหัสอิสระของตำแหน่งได้ ใน amd64 การกระโดดสามารถสัมพันธ์กับตัวนับโปรแกรมดังนั้นนี่เป็นการปรับปรุงที่ยิ่งใหญ่
2) สิ่งนี้ถูกต้อง ด้วยการปรับให้เหมาะสมที่ได้รับคำแนะนำจากการทำโปรไฟล์คุณจะสามารถชนะประสิทธิภาพได้ประมาณ 10-15 เปอร์เซ็นต์ ตอนนี้ความเร็วของ CPU ถึงขีด จำกัด แล้วมันน่าจะคุ้มค่าแล้ว
ฉันจะเพิ่ม: (3) ตัวเชื่อมโยงสามารถจัดเรียงฟังก์ชั่นในการจัดกลุ่มแคชที่มีประสิทธิภาพมากขึ้น นอกจากนี้ยังอาจมีผลต่อเวลาเริ่มต้นของแอปพลิเคชันโดยเฉพาะอย่างยิ่ง (ขึ้นอยู่กับผลลัพธ์ที่ฉันได้เห็นด้วยคอมไพเลอร์ Sun C ++)
และอย่าลืมว่าด้วย DLLs จะไม่มีการกำจัดโค้ดที่ตายแล้ว รหัส DLL อาจไม่เหมาะสมที่สุดทั้งนี้ขึ้นอยู่กับภาษา ฟังก์ชั่นเสมือนเป็นเสมือนจริงเสมอเพราะคอมไพเลอร์ไม่รู้ว่าลูกค้าเขียนทับมันหรือไม่
ด้วยเหตุผลเหล่านี้ในกรณีที่ไม่มีความต้องการที่แท้จริงสำหรับ DLLs ให้ใช้การรวบรวมแบบคงที่
แก้ไข (เพื่อตอบความคิดเห็นโดยผู้ใช้ขีดล่าง)
นี่คือแหล่งข้อมูลที่ดีเกี่ยวกับปัญหาตำแหน่งรหัสอิสระhttp://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
ตามที่อธิบายไว้ x86 ไม่ได้มี AFAIK สำหรับสิ่งอื่นแล้วช่วงการกระโดด 15 บิตและไม่ใช่การกระโดดและการโทรแบบไม่มีเงื่อนไข นั่นเป็นเหตุผลที่ฟังก์ชั่น (จากเครื่องกำเนิดไฟฟ้า) ที่มีมากกว่า 32K เป็นปัญหาเสมอและจำเป็นต้องใช้แทรมโพลีนแบบฝัง
แต่บนระบบปฏิบัติการ x86 ยอดนิยมเช่น Linux คุณไม่จำเป็นต้องสนใจว่าไฟล์. so / DLL ไม่ได้ถูกสร้างขึ้นด้วยgcc
สวิตช์-fpic
(ซึ่งบังคับใช้การใช้ตารางกระโดดทางอ้อม) เพราะถ้าคุณทำไม่ได้รหัสถูกแก้ไขเช่นเดียวกับ linker ปกติจะย้ายมัน แต่ในขณะที่ทำสิ่งนี้มันทำให้ส่วนของโค้ดไม่สามารถแชร์ได้และมันจะต้องทำการแมปเต็มรูปแบบของรหัสจากดิสก์ไปยังหน่วยความจำและสัมผัสทั้งหมดก่อนที่จะสามารถใช้งานได้ (ล้างแคชส่วนใหญ่ เมื่อสิ่งนี้ถูกพิจารณาว่าช้า
ดังนั้นคุณจะไม่ได้รับผลประโยชน์ใด ๆ อีกต่อไป
ผมจำไม่ได้ว่าสิ่งที่ OS (Solaris หรือ FreeBSD) ให้ฉันมีปัญหากับการสร้างระบบยูนิกซ์ของฉันเพราะฉันก็ไม่ได้ทำเช่นนี้และสงสัยว่าทำไมมันกระแทกจนกว่าฉันจะนำมาใช้ในการ-fPIC
gcc