Tôi sẽ đoán mò:
Hàm tạo và hàm hủy của C ++ hoàn toàn không phải là hàm: chúng là các macro. Chúng được đưa vào phạm vi nơi đối tượng được tạo và phạm vi nơi đối tượng bị phá hủy. Đổi lại, không có hàm tạo cũng như hàm hủy, đối tượng chỉ là IS.
Trên thực tế, tôi nghĩ rằng các hàm khác trong lớp cũng không phải là hàm, mà là các hàm nội tuyến KHÔNG được nội tuyến vì bạn lấy địa chỉ của chúng (trình biên dịch nhận ra bạn đang ở trên đó và không nội tuyến hoặc nội tuyến mã vào hàm và tối ưu hóa chức năng đó) và đến lượt chức năng dường như "vẫn ở đó", mặc dù nó sẽ không nếu bạn không lấy địa chỉ của nó.
Bảng ảo của "đối tượng" C ++ không giống như một đối tượng JavaScript, nơi bạn có thể lấy hàm tạo của nó và tạo các đối tượng từ nó trong thời gian chạy qua new XMLHttpRequest.constructor
, mà là một tập hợp các con trỏ tới các hàm ẩn danh hoạt động như giao diện với đối tượng này , không bao gồm khả năng tạo đối tượng. Và thậm chí không có ý nghĩa gì khi "xóa" đối tượng, bởi vì nó giống như cố gắng xóa một cấu trúc, bạn không thể: nó chỉ là một nhãn ngăn xếp, chỉ cần viết cho nó khi bạn vui lòng dưới nhãn khác: bạn có thể tự do sử dụng một lớp là 4 số nguyên:
/* i imagine this string gets compiled into a struct, one of which's members happens to be a const char * which is initialized to exactly your string: no function calls are made during construction. */
std::string a = "hello, world";
int *myInt = (int *)(*((void **)&a));
myInt[0] = 3;
myInt[1] = 9;
myInt[2] = 20;
myInt[3] = 300;
Không có rò rỉ bộ nhớ, không có vấn đề gì, ngoại trừ việc bạn lãng phí một cách hiệu quả một loạt không gian ngăn xếp dành riêng cho đối tượng giao thoa và chuỗi, nhưng nó sẽ không phá hủy chương trình của bạn (miễn là bạn không thử sử dụng nó như một chuỗi một lần nữa).
Trên thực tế, nếu các giả định trước đây của tôi là chính xác: chi phí hoàn chỉnh của chuỗi chỉ là chi phí lưu trữ 32 byte này và không gian chuỗi không đổi: các hàm chỉ được sử dụng tại thời điểm biên dịch, và cũng có thể được đưa vào và bỏ đi sau đối tượng được tạo và sử dụng (Như thể bạn đang làm việc với một cấu trúc và chỉ được gọi trực tiếp với nó mà không có bất kỳ lệnh gọi chức năng nào, chắc chắn có các cuộc gọi trùng lặp thay vì nhảy chức năng, nhưng điều này thường nhanh hơn và sử dụng ít không gian hơn). Về bản chất, bất cứ khi nào bạn gọi bất kỳ chức năng nào, trình biên dịch chỉ cần thay thế cuộc gọi đó bằng các hướng dẫn để thực hiện theo nghĩa đen, với các ngoại lệ mà các nhà thiết kế ngôn ngữ đã đặt ra.
Tóm tắt: Các đối tượng C ++ không biết chúng là gì; tất cả các công cụ để giao tiếp với chúng đều được nội tuyến tĩnh và bị mất khi chạy. Điều này làm cho việc làm việc với các lớp hiệu quả như điền vào các cấu trúc dữ liệu và trực tiếp làm việc với dữ liệu đó mà không gọi bất kỳ chức năng nào (các chức năng này được nội tuyến).
Điều này hoàn toàn khác với các cách tiếp cận của COM / ObjectiveC cũng như javascript, giữ lại thông tin kiểu động, với chi phí thời gian chạy, quản lý bộ nhớ, các lệnh gọi, vì trình biên dịch không thể loại bỏ thông tin này: cần thiết cho công văn năng động. Điều này đến lượt chúng ta có khả năng "Nói" với chương trình của chúng ta trong thời gian chạy và phát triển nó trong khi nó đang chạy bằng cách có các thành phần có thể phản xạ.