Operator new 返回比请求更多的内存
Operator new returning more memory than asked to
我想覆盖运算符 new
以获得此签名:
void* operator new(size_t bytes, MemoryManager* man);
class MemoryManager
看起来像这样:
struct MemoryManager
{
virtual void* Allocate(size_t bytes) = 0;
virtual void Deallocate(void* ptr) = 0;
};
现在我想要做的是让重载的 new
函数分配比要求的更多的内存。然后在最后几个字节中它将存储一个指向 MemoryManager
对象的指针,以便它知道在我的自定义 delete
运算符中使用什么函数。所以它看起来像这样分配:
__________
| | _
|__________| |
| | |
|__________| |
| | | <---- Bytes requested for object
|__________| |
| | |
|__________| |
| | _|
|__________|
| | _
|__________| | <---- Pointer to MemoryManager
| | _|
|__________|
现在我真正的问题是:这样做会导致未定义的行为吗?有些事情可能是个问题:
- 它可能未定义
new
到 return 比请求的字节多
- 您可能 运行 遇到对齐问题(但这些问题可能会被克服)
这种事情比较常见。但是,您通常会在开始而不是结束时存储额外的数据(注意平台的最大对齐方式,即您可能需要填充)。语言中没有任何内容禁止您提出的建议。
来自[basic.stc.dynamic.allocation]:
The allocation function attempts to allocate the requested amount of storage. If it is successful, it shall return the address of the start of a block of storage whose length in bytes shall be at least as large as the requested size.
添加了重点。所以是的,该标准允许一个有效的存储区域具有比严格要求的更多 space。
我想覆盖运算符 new
以获得此签名:
void* operator new(size_t bytes, MemoryManager* man);
class MemoryManager
看起来像这样:
struct MemoryManager
{
virtual void* Allocate(size_t bytes) = 0;
virtual void Deallocate(void* ptr) = 0;
};
现在我想要做的是让重载的 new
函数分配比要求的更多的内存。然后在最后几个字节中它将存储一个指向 MemoryManager
对象的指针,以便它知道在我的自定义 delete
运算符中使用什么函数。所以它看起来像这样分配:
__________
| | _
|__________| |
| | |
|__________| |
| | | <---- Bytes requested for object
|__________| |
| | |
|__________| |
| | _|
|__________|
| | _
|__________| | <---- Pointer to MemoryManager
| | _|
|__________|
现在我真正的问题是:这样做会导致未定义的行为吗?有些事情可能是个问题:
- 它可能未定义
new
到 return 比请求的字节多 - 您可能 运行 遇到对齐问题(但这些问题可能会被克服)
这种事情比较常见。但是,您通常会在开始而不是结束时存储额外的数据(注意平台的最大对齐方式,即您可能需要填充)。语言中没有任何内容禁止您提出的建议。
来自[basic.stc.dynamic.allocation]:
The allocation function attempts to allocate the requested amount of storage. If it is successful, it shall return the address of the start of a block of storage whose length in bytes shall be at least as large as the requested size.
添加了重点。所以是的,该标准允许一个有效的存储区域具有比严格要求的更多 space。