Hãy nói rằng chúng tôi có một lớp trông như thế này:Cấu trúc bộ nhớ của đối tượng chỉ có chức năng?
class A
{
public:
int FuncA(int x);
int FuncB(int y);
int a;
int b;
};
Bây giờ, tôi biết rằng đối tượng của lớp này sẽ được đặt ra trong bộ nhớ chỉ với hai ints
. Tức là, nếu tôi tạo một vectơ các cá thể của lớp A
, sẽ có hai ints
cho một cá thể, sau đó theo sau là hai ints
cho ví dụ thứ hai vv. Các đối tượng là POD.
NHƯNG giả sử lớp trông như thế này:
class B
{
public:
int FuncA(int x);
int FuncB(int y);
};
gì làm đối tượng của cái nhìn lớp này như thế nào trong bộ nhớ? Nếu tôi điền vào một vectơ với các trường hợp B
... thì có gì trong vector? Tôi đã được thông báo rằng các hàm thành viên không thuộc ảo được kết thúc dưới dạng các hàm miễn phí ở đâu đó hoàn toàn không liên quan đến các cá thể của lớp mà chúng được khai báo (hàm ảo cũng vậy, nhưng các đối tượng lưu trữ vtable với các con trỏ hàm) . Rằng các hạn chế truy cập chỉ đơn thuần là ở cấp độ ngữ nghĩa "con người". Chỉ các thành viên dữ liệu của một lớp (và vtable v.v.) thực sự tạo nên cấu trúc bộ nhớ của các đối tượng.
Vì vậy, một lần nữa, đối tượng của lớp B
trông giống như thế nào trong bộ nhớ? Có một số loại giá trị giữ chỗ không? Cái gì đó phải ở đó, tôi có thể lấy địa chỉ của vật thể. Nó phải trỏ đến một cái gì đó. Bất kể nó là gì, trình biên dịch có cho phép inline/tối ưu hóa các đối tượng này và xử lý các cuộc gọi phương thức như các cuộc gọi hàm bình thường miễn phí không? Nếu tôi tạo một vectơ của chúng và gọi cùng một phương thức trên mọi đối tượng, trình biên dịch có thể loại bỏ vectơ và thay thế nó chỉ bằng một loạt các cuộc gọi bình thường không?
Tôi chỉ tò mò thôi.
Nó xảy ra với tôi rằng nếu bạn muốn một wrapper đóng gói cho các chức năng có * không gian * không gian, bạn có thể sử dụng một không gian tên thay vì một lớp. Ngoài ra, nếu bạn làm cho các thành viên hoạt động tĩnh, bạn không bao giờ cần phải khởi tạo một đối tượng để truy cập chúng một cách tương tự như vậy, nó sẽ mất không gian. – Clifford