xem xét:C++ nhớ bảng chức năng ảo tốn
class A
{
public:
virtual void update() = 0;
}
class B : public A
{
public:
void update() { /* stuff goes in here... */ }
private:
double a, b, c;
}
class C {
// Same kind of thing as B, but with different update function/data members
}
Tôi bây giờ thực hiện:
A * array = new A[1000];
array[0] = new B();
array[1] = new C();
//etc., etc.
Nếu tôi gọi sizeof(B)
, kích thước trở lại là kích thước theo yêu cầu của 3 thành viên tăng gấp đôi, cộng với một số chi phí cần thiết cho bảng con trỏ hàm ảo. Bây giờ, trở lại mã của tôi, nó chỉ ra rằng 'sizeof (myclass)' là 32; có nghĩa là, tôi đang sử dụng 24 byte cho các thành viên dữ liệu của tôi, và 8 byte cho bảng chức năng ảo (4 chức năng ảo). Câu hỏi của tôi là: có cách nào tôi có thể sắp xếp hợp lý điều này không? Chương trình của tôi cuối cùng sẽ sử dụng rất nhiều bộ nhớ, và tôi không thích âm thanh 25% của nó được ăn bởi các con trỏ hàm ảo.
Đừng quên trình phá hủy ảo. – GManNickG
Nhìn vào chiến lược phân bổ của bạn, bạn có thể tốt hơn khi điều tra bằng cách sử dụng phân bổ tùy chỉnh từ mỗi 'B',' C', v.v. Sử dụng một 'mới' cơ bản cho một số lượng lớn các đối tượng đơn lẻ có thể được thêm nhiều chi phí hơn bạn nhận ra . –
Khi câu trả lời được ghi chú, bạn chỉ trả một con trỏ cho mỗi cá thể (4 byte trên x86 và 8 byte trên x64). Tuy nhiên, liên kết bộ nhớ có thể thay đổi hình ảnh một chút (ví dụ, nếu bạn có một lớp với một char và phương thức ảo, nó thường sẽ mất 8 byte trên x86). Ngoài ra, trình biên dịch Microsoft C++ đã biết lỗi với việc sắp xếp vfptr có thể thêm 4 hoặc nhiều byte vào kích cỡ lớp. – sbk