Tôi đã nghe nói rằng các phiên bản gcc gần đây rất tốt trong việc chuyển đổi cuộc gọi thông qua các con trỏ hàm để gọi trực tiếp. Tuy nhiên, tôi không thể tìm thấy bất kỳ điều gì về nó trên web hoặc giao diện nhanh thông qua mã nguồn của gcc. Có ai biết nếu điều này là thực sự đúng sự thật và nếu như vậy, những gì nó sử dụng thuật toán để làm điều này?Thuật toán nào gcc sử dụng để chuyển đổi cuộc gọi thông qua các con trỏ hàm để gọi trực tiếp?
5
A
Trả lời
0
Nó chỉ là một hình thức tuyên truyền giá trị. Nếu tôi có thể chứng minh rằng con trỏ đối tượng p (đến một cals ảo) luôn trỏ đến một đối tượng của một lớp cụ thể cụ thể, thì tôi có thể gọi trực tiếp các hàm thành viên của lớp đó. Nếu không, tôi phải trải qua vtable.
1
Bạn có thể thấy bài viết này thú vị. Nó ra tháng năm 2005, và tôi không chắc chắn nếu đó là 'gần đây' đủ, nhưng nó thỏa thuận với chủ đề một cách toàn diện:
Các vấn đề liên quan
- 1. Khi nào tôi nên sử dụng cuộc gọi() vs gọi hàm trực tiếp?
- 2. gdb in đẹp với các cuộc gọi hàm trực tiếp
- 3. Có thể gọi hàm tĩnh thông qua một con trỏ hàm trong C?
- 4. Chuyển tiếp cuộc gọi Twilio
- 5. Tăng tốc các cuộc gọi hàm ảo trong gcc
- 6. Chỉ có thể sử dụng con trỏ đến hàm bị ràng buộc để gọi hàm
- 7. Cách gọi hàm thành viên thông qua con trỏ hàm thành viên?
- 8. Lý do để sử dụng "syscall" thay vì gọi hàm trực tiếp là gì?
- 9. Làm thế nào để gọi một hàm di chuyển con trỏ mà không rời khỏi chế độ trực quan?
- 10. truyền một vector giữa các hàm thông qua con trỏ
- 11. Tín hiệu/Slot so với các cuộc gọi hàm trực tiếp
- 12. Gọi C++ con trỏ hàm từ C#
- 13. làm cách nào để sử dụng thuật toán STL với vectơ của con trỏ
- 14. Hàm con trỏ tới hàm __attribute __ ((const))?
- 15. Gọi hàm C với con trỏ ngăn xếp khác nhau (gcc)
- 16. Các cuộc gọi hàm jquery Delay
- 17. Có thể vượt qua cuộc gọi qua dấu chấm lửng qua trực tiếp không?
- 18. Có thể sử dụng các chức năng được sử dụng thông qua các con trỏ hàm không?
- 19. Làm thế nào để sử dụng LLVM để tạo biểu đồ cuộc gọi?
- 20. Tại sao GCC trừ giá trị sai cho con trỏ ngăn xếp khi phân bổ một mảng lớn không có các cuộc gọi hàm tiếp theo?
- 21. Làm cách nào để chuyển một hàm thành viên của lớp như một cuộc gọi lại?
- 22. Gọi con trỏ hàm thành viên C++: con trỏ này bị lỗi
- 23. Gọi chức năng đối tượng thông qua con trỏ đối tượng
- 24. Làm thế nào để sử dụng Logback trực tiếp mà không cần phải thông qua SLF4J
- 25. Sử dụng hàm tạo trong một cuộc gọi hàm?
- 26. P/gọi hàm lấy con trỏ đến cấu trúc
- 27. cách sử dụng ContextBoundObject để chặn cuộc gọi hàm trước/sau khi gọi?
- 28. Con trỏ hàm và gọi lại trong C
- 29. C++: Gọi chức năng thành viên qua con trỏ
- 30. performSelector vs hiệu suất cuộc gọi trực tiếp
Tôi không quen thuộc với hoạt động bên trong gcc, nhưng nói chung, nếu một trình biên dịch có thể chứng minh rằng một con trỏ hàm chỉ có thể có một giá trị cụ thể tại một trang gọi nào đó, sau đó cuộc gọi đó có thể được mã hóa như một cuộc gọi trực tiếp đến giá trị con trỏ cụ thể hơn là một cuộc gọi gián tiếp thông qua con trỏ hàm. –