Có hai quyết định có phần riêng biệt trình biên dịch làm liên quan đến chức năng nội tuyến:
- liệu một chức năng cuộc gọi cụ thể được inlined;
- liệu phiên bản không nội tuyến của hàm có tồn tại hay không.
Việc đầu tiên được quyết định bởi trình biên dịch theo từng trường hợp, nếu nội tuyến có thể thực hiện tại thời điểm đó. Sẽ không thể thực hiện được nếu hàm này là ảo, hoặc được gọi thông qua một con trỏ hàm, và nó không thể xác định tại thời gian biên dịch mà hàm sẽ được gọi. Nó sẽ không thể nếu định nghĩa không có sẵn cho trình biên dịch, có lẽ bởi vì nó được định nghĩa trong một đơn vị dịch khác và trình biên dịch không làm "tối ưu toàn bộ chương trình". Quyết định có thể, hoặc có thể không, bị ảnh hưởng bởi liệu chức năng có được khai báo là inline
hay không và các yếu tố khác như kích thước của nó và tần suất được gọi.
Tùy chọn thứ hai phụ thuộc vào việc liệu có phải phiên bản không phải nội tuyến hay không. Nó sẽ được yêu cầu nếu bất kỳ cuộc gọi đến nó không phải là inlined. Nó cũng sẽ (theo báo giá của bạn) được yêu cầu nếu bất cứ điều gì cần địa chỉ của hàm, vì nó phải có một địa chỉ. Điều này có thể xảy ra trực tiếp (ví dụ bằng cách gán địa chỉ cho một con trỏ hàm), hoặc gián tiếp (ví dụ, các hàm ảo sẽ cần địa chỉ của chúng được lưu trữ ở đâu đó để tra cứu theo thời gian chạy theo kiểu động của đối tượng).
Sự tồn tại của phiên bản không nội tuyến sẽ không ngăn cản bất kỳ cuộc gọi cụ thể nào đến chức năng này, mặc dù có thể ảnh hưởng đến quyết định của trình biên dịch, đặc biệt nếu nó được định cấu hình để tối ưu hóa kích thước mã.
Để tóm tắt, báo giá của bạn đơn giản và không hoàn toàn chính xác; trình biên dịch vẫn có thể "thực hiện nội tuyến" nếu địa chỉ được thực hiện, nó chỉ không thể bỏ qua phiên bản không nội tuyến.
Nguồn
2011-07-05 17:08:15
Oh Tôi ghét hệ thống downvotes câu hỏi miễn phí mới này. Cái quái gì sai với câu hỏi này, mọi người? –
Trong tò mò, cuốn sách nào đang đưa ra tuyên bố đó? –
+1 để truy cập vô danh drive-by downvoter –