1

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

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

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

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

4

1 回答 1

3

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

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

 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; 

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

 operator delete(void *mem)
 {
    void **ptr = reinterpret_cast<void **>(mem); // This is the "aligned" pointer. 
    void *orig_mem = ptr[-1]; 
    free(orig_mem);
 }
于 2013-08-08T22:16:43.413 回答