gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:03 26 4
gpt4 key购买 nike

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

最佳答案

因为它似乎始终使用 4 个字节作为大小,您可以安排您的 operator new[] 函数返回比 16 字节对齐的地址少 4 个字节。您仍然希望 operator new 直接返回 16 字节对齐的地址。

关于C++ 强制 new[] 不分配 4 个额外的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36049850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com