Tôi đang cố gắng thực hiện một trình quản lý bộ nhớ tùy chỉnh và tôi tự hỏi nếu có cách nào tốt hơn để thực hiện chức năng này, như khi tôi được hỏi về số học con trỏ void, nhiều người nghĩ rằng nếu tôi có một khoảng trống * trong C++, một cái gì đó rất sai.Custom Memory Manager
// allocates a page of memory.
void ObjectAllocator::allocatePage()
{
//if(OAStats_.PagesInUse_ >= Config_.MaxPages_)
//throw exception
void* buffer = ::operator new(OAStats_.PageSize_); // allocate memory, no constructor call.
// =============== Setup the PageList_ ===============
GenericObject* pNewNode = ::new(buffer) GenericObject(); // Construct GenericObject for the pagelist.
pNewNode->Next = PageList_->Next; // pNewNode points to wherever PageList_ pointed to.
PageList_->Next = pNewNode; // PageList_ points to pNewNode
pNewNode = NULL; // dont need this handle anymore
buffer = static_cast<char*>(buffer) + sizeof(GenericObject); // move pointer to point after the generic object.
// =============== Setup the FreeList_ ===============
for(int i=0;i<Config_.ObjectsPerPage_;++i)
{
static GenericObject* pPreviousNode = NULL; // static variable to hold the previous node
pNewNode = ::new(buffer) GenericObject(); // Construct GenericObject for the freelist.
pNewNode->Next = pPreviousNode;
pPreviousNode = pNewNode;
buffer = static_cast<char*>(buffer) + OAStats_.ObjectSize_; // move pointer by ObjectSize.
++OAStats_.FreeObjects_;
}
FreeList_->Next = pNewNode;
++OAStats_.PagesInUse_;
++OAStats_.Allocations_;
}
"một số người nghĩ rằng nếu tôi có khoảng trống * trong C++, có điều gì đó rất sai." <- Tôi sẽ không đồng ý với điều đó. Void con trỏ có sử dụng của họ. Tôi cho rằng nó đi xuống cho dù bạn là một phần của cộng đồng 'chống C' C++, hay không. Tôi có xu hướng nói rằng trong khi có, C++ là một ngôn ngữ cấp cao hơn C, mọi người thường làm những điều cấp thấp trong đó và do đó không có gì sai khi sử dụng nhiều tính năng 'C-like' hơn. – Stephen
@Stephen: Tại sao có quá nhiều lập trình viên có phản xạ đầu gối này khi một khái niệm bị chỉ trích họ chỉ * có * để nói "nó không phải là xấu, nó có sử dụng của nó". Tôi cho rằng bạn nói giống nhau về những người độc thân và gotos. Nhưng trong trường hợp này, việc sử dụng void là gì? Tại sao anh ta nên sử dụng một khoảng trống * ở đây? – jalf
@Jalf Bởi vì những nhận xét tiêu cực dính vào tâm trí của mọi người nhiều hơn những bình luận tích cực. Điều đó có nghĩa là nếu một người mới lập trình, hoặc chưa từng nghe về X trước đây, hãy đọc một bình luận cho rằng X sẽ nói rằng bạn không nên sử dụng nó, họ có khả năng nắm lấy kiến thức đó và đánh giá nó như một thực tế trong tâm trí họ. Moreso, tôi chỉ đang nói một ý kiến. Bạn có trả lời tương tự nếu tôi đã sao lưu chế độ xem "không sử dụng con trỏ void" không? Ở đây không, không có lý do để sử dụng nó, nhưng OP chỉ đơn giản nói rằng mọi người đã nói với anh ta không sử dụng chúng nói chung khi mã hóa C++. – Stephen