为什么大多数平台上都没有'aligned_realloc'?

Tar*_*ras 4 c c++ memory-management c11 c++17

MSVC具有自己的非标准功能_aligned_malloc_aligned_realloc并且_aligned_free

C ++ 17和C11已经介绍(std::)aligned_alloc,其结果可以分配freerealloc。但是realloc不能用于实际重新分配由返回的内存aligned_alloc,因为它没有对齐参数,因此不能保证返回的指针将正确对齐。

我什至找不到任何非标准扩展,它们可以在Microsoft Windows / Visual C ++以外的平台上重新分配对齐的内存(保留对齐)。

我搜索错误_aligned_realloc吗,还是在POSIX和其他平台上确实没有其他选择?

如果是这样的话,

  1. 为什么?
  2. 在那些平台上可以代替使用什么?有什么比调用aligned_alloc新对齐,然后做memcpyfree荷兰国际集团成功的老猎狗?

Val*_*umn 5

尽管POSIX(在大多数平台上趋向于充当最低的公分母)不具有an aligned_realloc,但它确实具有aligned_allocand memcpy。因此,您可以很容易地实现自己的实现aligned_realloc,使用这些保证可以在任何合理的posix兼容平台上工作。但是,请注意,没有posix标准方法来获取malloc'd内存区域的大小。您必须自己进行跟踪。

编辑:有一些空闲时间,所以我将其扩展为回答最常见的批评

正如精明的评论者所指出的那样,我所提议的是realloc内部工作方式。

realloc幕后,您的标准实现将竭尽所能避免执行上述的malloc和memcpyinging行为,然后再免费提供。在求助于回退之前,它将尝试使用两种行为之一。1)如果新的大小小于旧的大小,它将在适当的位置调整内存大小,避免分配,复制或释放内存。2)如果新的大小大于旧的大小,它将(以简化的方式)查看是否有足够的空闲内存相邻,如果是,它将吞噬该内存并适当调整大小。如果不是,则求助于后备。

我提出了一种幼稚的方法,因为我认为大多数人问这个问题都不必实现自己的malloc实现。(尽管我强烈建议这样做是出于教育目的)

希望这能满足任何投诉!

  • `realloc` 函数有许多设计缺陷。添加新的变体将需要使这些缺陷永久化,或者就如何修复这些缺陷达成共识。在许多实现中,解决大多数这些问题的最实用方法是将指针传递给指向对象的指针,但某些实现将无法支持这样的概念。因此,不可能达成共识解决方案。 (2认同)

Evg*_*Evg 4

英特尔数学内核库(免费;适用于 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)