gpt4 book ai didi

c++ - 在堆上分配时对齐内存

转载 作者:行者123 更新时间:2023-11-30 02:53:17 51 4
gpt4 key购买 nike

我在 C++ 中遇到了 new() 运算符的这个示例实现:

void *operator new(size_t size){
if(void *mem = malloc(size)){
cout << "allocated memory" << endl;
return mem;
}
else{
throw bad_alloc();
}
}

如何编辑此函数,以便可以在特定的“字节边界”上分配内存(我指的是性能圈中讨论的数据对齐)?

(我假设这不仅仅是由编译器自动完成的——或者如果是,手动实现它有什么好处吗?)

最佳答案

您需要找到一种方法来保留原始指针,否则您的 free 会变得非常糟糕。

对齐是一个简单的例子(假设 alignment 是一个 2n 值):

 void *aligned = reinterpret_cast<void *>(
(reinterpret_cast<uintptr_t>(mem) + alignment-1) & ~(alignment-1));

但是,正如我所说,您需要将原始指针保存在某个地方。这可能意味着分配“有点额外”(例如 sizeof(void *))。

所以我们最终得到这样的结果:

 assert(!(alignment & alignment-1)); // Don't like aligment not power of 2.

size_t extra = sizeof(void *);
void *mem = malloc(size + extra + alignment-1);
if (!mem)
throw bad_alloc();

void *aligned = reinterpret_cast<void *>(
(reinterpret_cast<uintptr_t>(mem) + extra + alignment-1) & ~(alignment-1));
void **ptr = reinterpret_cast<void **>(aligned);
ptr[-1] = mem;
return aligned;

然后在operator delete中,需要挖出你原来的指针:

 operator delete(void *mem)
{
void **ptr = reinterpret_cast<void **>(mem); // This is the "aligned" pointer.
void *orig_mem = ptr[-1];
free(orig_mem);
}

关于c++ - 在堆上分配时对齐内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18136773/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com