我正在用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;
}
答案 0 :(得分:0)
由于它似乎一直使用4个字节的大小,你可以安排你的operator new[]
函数返回4个小于16字节的对齐地址。您仍然希望operator new
直接返回一个16字节对齐的地址。