2011-10-18 6 views
6

Theo tiêu chuẩn, các hàm nội tuyến bên ngoài phải cùng một địa chỉ trong tất cả các đơn vị dịch.Các hàm nội tuyến bên ngoài phải có cùng địa chỉ trong tất cả các đơn vị dịch. Làm thế nào heck là đạt được?

Làm cách nào để đạt được điều này trong trình biên dịch? Ý tôi là khi tôi biên dịch một số đơn vị dịch thuật, tôi không biết các TU khác sẽ như thế nào. Vậy làm thế nào tôi có thể có cùng một địa chỉ ở khắp mọi nơi?

Trả lời

6

Điều đó tùy thuộc vào việc triển khai, nhưng thường nó được giải quyết bởi trình liên kết. Mỗi đơn vị dịch được biên dịch sẽ tạo ra một tệp đối tượng có chứa một bản sao của hàm, được gắn cờ theo một cách nào đó để trình liên kết biết rằng nó sẽ mong đợi (và chấp nhận) các bản sao. Trình liên kết sẽ bao gồm một trong số chúng, loại bỏ những người khác và giải quyết mọi tham chiếu đến hàm.

+0

Còn thư viện thì sao? Hay tôi đi xa? –

+0

Nevermind, tôi chỉ nhận ra rằng không có sự khác biệt :) –

+0

@Let_Me_Be: Thư viện tĩnh thường chỉ là tập hợp các tệp đối tượng và có thể chứa nhiều bản sao của hàm, để được giải quyết sau khi liên kết vào chương trình. Các thư viện chia sẻ thường được liên kết giống như một chương trình, vì vậy nhiều bản sao có thể được loại bỏ sau đó. –

4

Chiến lược đơn giản: mỗi lần hàm inline được xác định, biên dịch nó thành thời gian đối tượng như thể nó là một hàm bình thường. Sau đó, tại thời gian liên kết, phát hiện các chức năng trùng lặp và xóa chúng, để lại một bản sao của từng chức năng. Đây là cách trình biên dịch C++ được sử dụng để làm việc (cũng như khi đối mặt với các khuôn mẫu) cách đây 10 năm. Không chắc chắn làm thế nào họ làm điều đó ngày nay.