Thuộc tính inline
chỉ là một gợi ý cho trình biên dịch là nó nên cố gắng nội tuyến chức năng của bạn. Nó vẫn có thể lấy địa chỉ của hàm, và trong trường hợp đó trình biên dịch cũng sẽ cần phát ra một phiên bản không nội tuyến.
Ví dụ:
#include <stdio.h>
inline void f() {
printf("hello\n");
}
int main() {
f();
void (*g)() = f;
g();
}
Mã in trên hello
hai lần.
trình biên dịch của tôi gcc
(với -O
) phát ra mã một cái gì đó như thế này:
_main:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $20, %esp
call ___i686.get_pc_thunk.bx
"L00000000002$pb":
leal LC0-"L00000000002$pb"(%ebx), %eax
movl %eax, (%esp)
call L_puts$stub ; inlined call to f()
call L__Z1fv$stub ; function pointer call to f() (g is optimised away)
movl $0, %eax
addl $20, %esp
popl %ebx
popl %ebp
ret
Như bạn có thể thấy, có đầu tiên là một cuộc gọi đến puts()
và sau đó một cuộc gọi đến L__Z1fv()
(đó là tên đọc sai của f()
).
Nguồn
2010-07-23 13:03:03
Tôi nghĩ câu đó cần thêm ngữ cảnh. "hàm inline vẫn có một biến duy nhất" không có ý nghĩa. Tại sao bạn không nghĩ rằng một hàm nội tuyến có thể có một địa chỉ? –
Ấn bản nào? Tôi đang xem ấn bản thứ ba, và không thể nhìn thấy nó nói ở đâu. – Clifford
Trích dẫn chính xác từ sách - "Đặc biệt, một hàm nội tuyến vẫn có một địa chỉ duy nhất và do đó làm các biến tĩnh của một hàm nội tuyến". Đây là điều cuối cùng trong phần 7.1.1 - đoạn trước bắt đầu với "Trình định danh nội tuyến là một gợi ý * cho trình biên dịch" (nhấn mạnh của tôi). Các biến tĩnh được đề cập trong phần 7.1.2 – Steve314