2012-04-03 32 views
6

Nâng cấp ứng dụng từ 32 lên 64 bit làm tăng kích thước con trỏ và dấu chân bộ nhớ của đối tượng.Tối ưu hóa bố cục bộ nhớ của các cá thể lớp trong C++

Tôi đang tìm các phương pháp để giảm lượng bộ nhớ của đối tượng càng nhiều càng tốt. Đối với các cấu trúc POD, tôi đổ bộ nhớ của cấu trúc để tìm ra cách đóng gói các thành viên và giảm đệm trình biên dịch.

Có cách nào để tìm ra bố cục bộ nhớ của các đối tượng không phải POD chẳng hạn như các cá thể lớp không? Làm thế nào tôi có thể đạt được một cái gì đó tương tự như đóng gói các đối tượng lớp học?

Cảm ơn, Dan

+1

nói chung sẽ có là các cờ đặc trưng của trình biên dịch và các pragmas, và các trường sắp xếp lại có thể có hiệu lực. Tuy nhiên tất cả điều này có thể ảnh hưởng đến hiệu suất và khả năng tương tác – sehe

+0

Trình biên dịch nào bạn đang sử dụng? –

+0

@dbbd btw tại sao bạn lo lắng về kích thước bộ nhớ trong quy trình kiến ​​trúc 64 bit? kiến trúc 64 bit có thể hỗ trợ kích thước bộ nhớ ảo khổng lồ. Không giống như 32 bit arch – weima

Trả lời

1

Tôi không biết về cụ thể phi POD các đối tượng dữ liệu (ví dụ: vtable), mặc dù tôi cho rằng đó là quyết định bởi kích thước con trỏ. Dù sao, bạn có thể kiểm soát sự liên kết của các thành viên với chỉ thị biên dịch #pragma pack được hỗ trợ cả bởi GCCVisual Studio.

Bạn cũng có thể đọc đoạn 7,18 trên tuyệt vời Agner Fog C++ optimize guide:

Các thành viên dữ liệu của một lớp hoặc cấu trúc được lưu trữ liên tục theo thứ tự mà họ được khai báo bất cứ khi nào một thể hiện của lớp hoặc cấu trúc được tạo ra . Không có hình phạt hiệu suất để tổ chức dữ liệu thành các lớp hoặc cấu trúc. Truy cập dữ liệu thành viên của một đối tượng lớp hoặc cấu trúc không mất nhiều thời gian hơn việc truy cập một biến đơn giản. Hầu hết các trình biên dịch sẽ sắp xếp các thành viên dữ liệu đến các địa chỉ tròn để tối ưu hóa truy cập

4

Bạn có thể sử dụng GCC của -Wpadded thông báo cho bạn nơi đệm được thêm vào, sau đó sắp xếp lại dựa trên thông tin đó, giảm kích thước trong một số trường hợp.

Buộc đóng gói dữ liệu không phải là ý tưởng hay cho các biểu diễn trong bộ nhớ.

0

Quy tắc chung: lớn nhất đến nhỏ nhất; điều này cho phép căn chỉnh hoàn hảo khi kích thước phần tử là quyền hạn của hai, nếu không, tối ưu hóa thủ công là có thể.

Lưu ý rằng căn chỉnh phù hợp thường là cần thiết cho tốc độ, ngay cả khi CPU phục hồi do vi phạm. Trong khi bàn tay x86 và (AFAIK) x64 của CPU bị lệch hướng truy cập nội bộ với lần đọc thứ hai, thời gian "lãng phí" trên một lần đọc không chính xác thường lớn hơn nhiều so với thời gian được lưu do một bộ làm việc nhỏ hơn. Vì vậy, tôi sẽ "đóng gói chặt chẽ" chỉ khi bạn chạy so sánh trên nhiều CPU.

Vì không phải của POD, bạn phải kiểm tra số sizeof(element).
(Nếu có tấn của các đối tượng, tôi có thể đi với một cú pháp đơn giản tạo ra C++ để đổ các kích thước)

Ngoài ra, PVS-Studio có một phân tích về kích thước struct và đưa ra lời đề nghị sắp xếp lại. Tôi đã không xem xét chúng nhiều, nhưng bạn có thể sử dụng eval để tìm hiểu xem nó làm việc cho bạn.

+0

Sắp xếp lại các thành viên không phải là một lựa chọn dễ dàng vì có rất nhiều bộ mã hóa/giải mã và các công cụ RPC khác luôn là một nhức đầu lớn. Ngoài ra, đối với một ứng dụng bị ràng buộc IO, hiệu năng cpu không quan trọng. Tôi muốn đóng gói và lỏng CPU hơn hiệu suất đạt được và bộ nhớ rời - đặc biệt cho loại ứng dụng bị ràng buộc IO này. – dbbd

0

Liên quan đến các đối tượng không phải POD, tôi nghĩ bạn nên đọc thêm về vTable, hàm ảo, thừa kế ảo để biết những thứ nào tiến hành kích thước của lớp hoặc đối tượng.Trong thực tế, sự sắp xếp lớp mà lớp đệm của các ngươi, sự sắp xếp thành viên của lớp chỉ có một nhân tố dẫn tới kích thước của lớp.

Ở đây có một số trang web có liên quan, tôi nghĩ nó có thể hữu ích cho bạn.

  1. Xác định kích thước của đối tượng lớp: Bố cục http://www.cprogramming.com/tutorial/size_of_class_object.html

  2. Memory: http://www.phpcompiler.org/articles/virtualinheritance.html

Và, nếu bạn sử dụng MVSC, bạn có thể đổ tất cả các bố trí bộ nhớ của tất cả các lớp trong giải pháp của bạn với -d1reportAllClassLayout như sau:

cl -d1reportAllClassLayout main.cpp 
Các vấn đề liên quan