C强制new []不分配4个额外字节
发布时间:2020-12-16 06:51:26 所属栏目:百科 来源:网络整理
导读:我在C中编写自己的内存系统(出于性能原因,附加的调试信息,以便我可以分配16字节对齐的内存),我遇到了new []的问题. 似乎调用new []会导致额外的4个字节的分配,这表示数组中的元素数量,这会抛弃所有后续对象的对齐.所以我的问题是:有没有办法用编译器标志,编
我在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处的内存不是预期的变换[0]中的第一个值.相反,它包含值31.这意味着矩阵只有4字节对齐.有没有办法关闭那个数组大小业务,以便转换[0]的第一个字节最终在new []返回的地址? 这是我的operator 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; } 解决方法
由于它似乎始终使用4个字节的大小,您可以安排运算符new []函数返回4个小于16字节对齐的地址.您仍然希望让operator new直接返回一个16字节对齐的地址.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |