没有指针算法的自定义分配器
Custom allocator without pointer arithmetic
我有一个自定义分配器 class,看起来像这样:
class allocator {
private:
char* memory;
std::ptrdiff_t offset;
std::size_t total_size;
public:
allocator(std::size_t size) : total_size(size), offset(0) {
memory = new char[size];
}
void* allocate(std::size_t size, std::size_t alignment) {
// unimportant stuff
void* current_address = &start_ptr[offset]; // --> OUCH, pointer arithmethic
offset += size;
// unimportant stuff
return current_address;
}
}
正如您在上面看到的,我正在使用指针算法来计算新分配的内存块的当前地址。 CppCoreGuidelines 和许多其他准则不鼓励使用指针算术。那么有没有另一种管理内存池的方法呢?
我正在考虑使用 std::vector<char>
,因为它包含一个连续的内存块,并执行如下操作:
std::vector<char> memory;
void* current_address = &(memory.at(offset));
但这对我来说似乎并没有更好。您对如何以安全的方式干净地管理内存池有什么想法吗?
引用 YSC
的评论来回答这个问题:
They discourage pointer arithmetic for "standard" operations. Dealing
with uninitialized storage allocation is not. IMO, pointer arithmetic
in an allocator's allocate function is perfectly fine if its simple to
read.
我有一个自定义分配器 class,看起来像这样:
class allocator {
private:
char* memory;
std::ptrdiff_t offset;
std::size_t total_size;
public:
allocator(std::size_t size) : total_size(size), offset(0) {
memory = new char[size];
}
void* allocate(std::size_t size, std::size_t alignment) {
// unimportant stuff
void* current_address = &start_ptr[offset]; // --> OUCH, pointer arithmethic
offset += size;
// unimportant stuff
return current_address;
}
}
正如您在上面看到的,我正在使用指针算法来计算新分配的内存块的当前地址。 CppCoreGuidelines 和许多其他准则不鼓励使用指针算术。那么有没有另一种管理内存池的方法呢?
我正在考虑使用 std::vector<char>
,因为它包含一个连续的内存块,并执行如下操作:
std::vector<char> memory;
void* current_address = &(memory.at(offset));
但这对我来说似乎并没有更好。您对如何以安全的方式干净地管理内存池有什么想法吗?
引用 YSC
的评论来回答这个问题:
They discourage pointer arithmetic for "standard" operations. Dealing with uninitialized storage allocation is not. IMO, pointer arithmetic in an allocator's allocate function is perfectly fine if its simple to read.