Xin lưu ý rằng "ảo" và "nội tuyến" không phải là đối lập - một phương pháp có thể là cả hai. Trình biên dịch sẽ hạnh phúc inline một hàm ảo nếu nó có thể xác định loại đối tượng tại thời gian biên dịch:
struct B {
virtual int f() { return 42; }
};
struct D : public B {
virtual int f() { return 43; }
};
int main(int argc, char **argv) {
B b;
cout << b.f() << endl; // This call will be inlined
D d;
cout << d.f() << endl; // This call will be inlined
B& rb = rand() ? b : d;
cout << rb.f() << endl; // Must use virtual dispatch (i.e. NOT inlined)
return 0;
}
[UPDATE: Made nhất định rb
's thật năng động loại đối tượng không thể được biết đến tại thời gian biên dịch - nhờ cho MSalters]
Nếu loại đối tượng có thể được xác định tại thời gian biên dịch nhưng hàm không thể inlineable (ví dụ: lớn hoặc được định nghĩa bên ngoài định nghĩa lớp), nó sẽ được gọi là không thực sự.
Nguồn
2009-04-01 02:58:51
Có thể đăng một đoạn mã đại diện cho funciton ảo và cách nó được gọi. –
Tôi đã không sử dụng gprof, nhưng nó không đo thời gian * bên trong * chức năng hơn là thời gian gọi? – Uri
Ảo không ngụ ý không được gạch chân. Vui lòng xem câu trả lời đầy đủ của tôi để biết chi tiết. –