加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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字节对齐的地址.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读