Đây chắc chắn là một câu hỏi nghe có vẻ mơ hồ với một số người;)
Nhưng tôi nghĩ tôi biết bạn đến từ đâu.
Bạn có một triệu lựa chọn cho cách bạn có thể chọn để thực hiện điều này. Một số trong những lựa chọn đó nên xoay quanh cả nền tảng mục tiêu và mục tiêu thiết kế tổng thể. Những cân nhắc đó sẽ phá vỡ mọi mối quan hệ, cho đến khi bạn cảm thấy đủ thoải mái với các chi phí thực hiện khác nhau đủ để phát triển thiết kế từ nền tảng và mối quan tâm thiết kế chung trước tiên. Vì vậy, cho đến lúc đó, đây là một số cách mà bạn không phải trả giá về sự phức tạp (gánh nặng quản lý) hoặc trong việc xử lý loại bỏ hoặc thay đổi nếu bạn thay đổi quyết định ...
Nếu mục tiêu là đo lường và phân bổ, với khả năng sử dụng các nhóm, thì trước tiên bạn cần nghĩ đến bộ mã có thể sống tối thiểu để bắt đầu. Để giải thích, nếu bạn là một phần của các lớp, bạn có thể tạo một lớp, để cho một đống, hoặc thay vào đó sử dụng một tập hợp các hàm có một hàm xử lý hoặc tên heap. Nó thực sự là một vấn đề ngữ nghĩa phải trung thực. Quyết định tiếp theo là mới hoặc malloc; Tôi là một phần của malloc bởi vì nhiều lần tôi đang xử lý các công trình cấp thấp và tôi biết trong hầu hết các triển khai mà gọi là malloc, và tôi không phải lo lắng về sự phức tạp của việc quá tải mới và lo lắng về điều đó trên tất cả các nền tảng . Tuy nhiên, tôi đã nhiều lần xây dựng các hệ thống hoặc các thành phần xung quanh quá tải hoặc móc mới. Và tất nhiên, vấn đề cốt lõi hoặc khác biệt, đó là 'mới' phải biết loại trước khi phân bổ, trong đó 'malloc' không quan tâm và với malloc, bạn quyết định loại sau khi phân bổ. Tất cả chi tiết đó là để cung cấp cho bạn một ý tưởng và một số bối cảnh để đưa ra quyết định thiết kế trong các loại vấn đề này :)
Vì vậy, tôi sẽ chọn lớp học và malloc, bởi vì ở đây dễ giải thích hơn, nhưng cuối cùng nó thực sự không quan trọng. Các bộ phận bên trong cuối cùng sẽ mang ít sự khác biệt về vật liệu so với phần còn lại của thiết kế tổng thể.
Vì vậy, trong giả thuyết này, tôi biết rằng (hoặc sẽ giả định rằng) tôi có thể kết thúc với 7-8 lần khởi động lớp hệ thống thực sự và dự đoán hàng trăm ngàn cuộc gọi để phân bổ và miễn phí. Vì phần lớn sự tò mò và lực đẩy thực sự của tôi trong tất cả những điều này, thực sự là về kích thước và khía cạnh hồ sơ, tôi không muốn tạo gánh nặng cho hiệu suất ứng dụng một cách khôn ngoan. Đối với người mới bắt đầu, tôi có thể quyết định để toàn bộ công khai và công khai cho đến khi tôi đóng nó xuống, khi tôi thực hiện nó trong suốt phần còn lại của ứng dụng; một cấu trúc sẽ làm điều này độc đáo. 'S_' là để hiển thị các vars nào được dự định rõ ràng để thống kê.
struct Mem
{
int s_allocs;
int s_frees;
int s_peak;
int s_current;
void* heap; // if you wanted to go into having real actual separate heaps, else ignore
void* alloc(int size);
void free(void* p);
Mem() {memset(this,0,szieof(Mem));} // want this to be inlined with the call site constructor (a design decision example)
}
class MySubSystem
{
Mem mem;
.... you get the idea
}
Điều này là vô cùngnhẹ trên nhiều mặt trận, và có thể là một nơi tốt để bắt đầu xác định bất cứ nơi nào bạn thực sự muốn đi với điều này. Và bạn ngay lập tức có một vấn đề, làm thế nào để bạn biết kích thước của mặt hàng được giải phóng. (Đây sẽ là một vấn đề cần giải quyết cho gần như mọi cách tiếp cận.) Vì đây là một diễn đàn trò chơi, bạn có thể xem xét pha tạp một vài byte đầu tiên với kích thước, hoặc nếu không bạn phải bọc hoặc ghi nhớ theo một cách khác. Hầu hết sự nhạy cảm của nhà phát triển trò chơi không nên quá nhiều so với doping, và đây là ví dụ đơn giản nhất, vì tôi đã tạo ra một bức tường văn bản. Về cơ bản là như thế này: bạn không muốn nếu có thể được giúp phá hủy sự liên kết vốn có, bạn muốn biết, vì gần như miễn phí, nếu kích thước được kết hợp. Vì vậy, một cái gì đó đơn giản như "s_allocs ++; s_total + = size; uint64 * p = (uint64 *) malloc / calloc (size + = 8); * p = 0xDEADDAED00000000 | kích thước; return p + 1; "trong đó phân bổ sẽ nhỏ hơn 4GB và uint64 là bất cứ điều gì trình biên dịch nghĩ rằng int 64 bit không dấu và là nơi bạn có thể kiểm tra giá trị độ sạch miễn phí.
Đây là tất cả một cách để giúp bạn có mức tối thiểu trần với chi phí tối thiểu trần thỏa mãn các yêu cầu. Nó khôngphân bổ địa chỉ các lớp có chức năng ảo nếu chúng nằm trong phạm vi để lược tả hoặc quản lý, vì bạn không thể lường trước kích thước của môi trường c ++ mà bạn đang sử dụng cho những thứ đó mà không bị quá tải hoặc móc nối mới, hoặc nếu bạn đang dựa vào hàm tạo trong một trong các những cách kỳ lạ không thể được xử lý bởi một số chức năng 'init' khác. Mặt khác, một lớp là một lớp phân bổ tùy ý và tất cả đều giống nhau, khi bạn bỏ. Nếu bạn là một phần của mới và cần ngữ nghĩa của bảng ảo hoặc hàm tạo, thì bạn phải nối mới, nhưng đó là một động vật hoàn toàn mới, mà bạn cần thực sự nghiên cứu để đảm bảo rằng bạn đang làm những gì cần mới và sẽ phải báo hiệu mã của bạn đang xử lý mới, cái xô này được áp dụng cho. Nhưng nếu không thì khái niệm trên là như nhau.
Quan trọng hơn, điều này sẽ khiến bộ não của bạn hoạt động, và hy vọng dọc theo dòng của những gì bạn cần và khả năng chịu đựng của bạn là gì, bây giờ bạn đã nhìn thấy đằng sau bức màn một chút nữa. Không có thuật sĩ :)