C ++强制new []不分配4个额外字节

时间:2016-03-17 01:02:17

标签: c++ memory visual-studio-2013 new-operator

我正在用C ++编写自己的内存系统(出于性能原因,额外的调试信息,以便我可以分配16字节对齐的内存),我遇到了new []的问题。

调用new []似乎会导致额外的4个字节的分配,这表示数组中的元素数量,这会抛弃所有后续对象的对齐。所以我的问题是:有没有办法用编译器标志,编译指示声明等来关闭这4个额外字节的使用?

以下是一个例子:

// Matrix class has to be 16-byte aligned
Matrix* transforms = new( matrixHeap, ALIGN_16, __FILE__, __LINE__ ) Matrix[31];
transforms[0] = Matrix::Identity;

查看Visual Studio 2013调试器时,我看到了以下值:

returned by new    0x0F468840
transforms         0x0F468844

最后,我看一下原始记忆,我看到了:

0x0F468840   1F 00 00 00
0x0F468844   01 00 00 00

****** 40的内存不是预期的transforms[0]中的第一个值。相反,它包含值31。这意味着矩阵只有4字节对齐。有没有办法关闭那个数组大小业务,以便transforms[0]的第一个字节最终在new []返回的地址?

以下是我的运算符new []的重要部分:

void* operator new[] ( size_t size, Heap* heap, uint32_t alignment, char* file, int lineNumber )
{
    size_t alignedSize = size + alignment - 1;
    void* unalignedPtr = heap->Allocate( alignedSize );
    void* alignedPtr = (void*) (((size_t) unalignedPtr + alignment - 1) & ~(alignment - 1));
    return alignedPtr;
}

1 个答案:

答案 0 :(得分:0)

由于它似乎一直使用4个字节的大小,你可以安排你的operator new[]函数返回4个小于16字节的对齐地址。您仍然希望operator new直接返回一个16字节对齐的地址。