C++ 强制 new[] 不分配额外的 4 字节空间

4
我正在用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;
}

1
我不确定我理解你所描述的对齐问题。C++要求new返回的内存必须按照对象的对齐要求进行对齐。 - templatetypedef
matrixHeap 是什么? - M.M
这个问题在这个帖子中有解释(其中y = 4)。你还应该注意到,你的operator new[]接收到的size31*sizeof(Matrix)大4个字节。 - M.M
你不能改变这个(至少在标准C++中是不行的),问题是是否有可能想办法绕过它。也许一个更加准确的问题标题应该是“如何使用operator new进行自定义对齐”。 - M.M
1
好吧,这很丑,但我想我别无选择,只能用类似malloc的版本来替换我的new[]调用。 - David Christo
显示剩余6条评论
1个回答

0

由于它似乎始终使用4个字节的大小,因此您可以安排您的operator new[]函数返回比16字节对齐地址少4个字节。但您仍需要让operator new直接返回16字节对齐地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接