我正在用C++编写自己的内存系统(出于性能原因,额外的调试信息和为了分配16字节对齐的内存),但是我在使用
似乎调用
有没有办法通过编译器标志、
以下是一个例子:
最后,我窥探了原始内存,并看到了这个:
new[]
时遇到了问题。似乎调用
new[]
会导致额外分配4个字节来指示数组中元素的数量,这会使所有后续对象的对齐方式失效。所以我的问题是:有没有办法通过编译器标志、
pragma
声明等关闭使用这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;
}
new
返回的内存必须按照对象的对齐要求进行对齐。 - templatetypedefmatrixHeap
是什么? - M.My = 4
)。你还应该注意到,你的operator new[]
接收到的size
比31*sizeof(Matrix)
大4个字节。 - M.M