Tar*_*ras 4 c c++ memory-management c11 c++17
MSVC具有自己的非标准功能_aligned_malloc
,_aligned_realloc
并且_aligned_free
。
C ++ 17和C11已经介绍(std::)aligned_alloc
,其结果可代以分配free
或realloc
。但是realloc
不能用于实际重新分配由返回的内存aligned_alloc
,因为它没有对齐参数,因此不能保证返回的指针将正确对齐。
我什至找不到任何非标准扩展,它们可以在Microsoft Windows / Visual C ++以外的平台上重新分配对齐的内存(保留对齐)。
我搜索错误_aligned_realloc
吗,还是在POSIX和其他平台上确实没有其他选择?
如果是这样的话,
aligned_alloc
新对齐,然后做memcpy
和free
荷兰国际集团成功的老猎狗?尽管POSIX(在大多数平台上趋向于充当最低的公分母)不具有an aligned_realloc
,但它确实具有aligned_alloc
and memcpy
。因此,您可以很容易地实现自己的实现aligned_realloc
,使用这些保证可以在任何合理的posix兼容平台上工作。但是,请注意,没有posix标准方法来获取malloc
'd内存区域的大小。您必须自己进行跟踪。
编辑:有一些空闲时间,所以我将其扩展为回答最常见的批评
正如精明的评论者所指出的那样,我所提议的是realloc
内部工作方式。
在realloc
幕后,您的标准实现将竭尽所能避免执行上述的malloc和memcpyinging行为,然后再免费提供。在求助于回退之前,它将尝试使用两种行为之一。1)如果新的大小小于旧的大小,它将在适当的位置调整内存大小,避免分配,复制或释放内存。2)如果新的大小大于旧的大小,它将(以简化的方式)查看是否有足够的空闲内存相邻,如果是,它将吞噬该内存并适当调整大小。如果不是,则求助于后备。
我提出了一种幼稚的方法,因为我认为大多数人问这个问题都不必实现自己的malloc实现。(尽管我强烈建议这样做是出于教育目的)
希望这能满足任何投诉!
英特尔数学内核库(免费;适用于 Windows、Linux 和 macOS)版本 1.0 >= 11.3.1 可以mkl_realloc
保留对齐:
简单的例子:
auto p1 = std::aligned_alloc(1024, 1000);
std::cout << reinterpret_cast<std::uintptr_t>(p1) % 1024 << std::endl;
auto p2 = std::realloc(p1, 2000);
std::cout << reinterpret_cast<std::uintptr_t>(p2) % 1024 << std::endl;
auto p3 = std::realloc(p2, 3000);
std::cout << reinterpret_cast<std::uintptr_t>(p3) % 1024 << std::endl;
auto q1 = mkl_malloc(1000, 1024);
std::cout << reinterpret_cast<std::uintptr_t>(q1) % 1024 << std::endl;
auto q2 = mkl_realloc(q1, 2000);
std::cout << reinterpret_cast<std::uintptr_t>(q2) % 1024 << std::endl;
auto q3 = mkl_realloc(q2, 3000);
std::cout << reinterpret_cast<std::uintptr_t>(q3) % 1024 << std::endl;
Run Code Online (Sandbox Code Playgroud)
我的机器上的输出是:
0
784
784
0
0
0
Run Code Online (Sandbox Code Playgroud)