visual studio 2019 缺少 std::aligned_alloc() 函数?

8
尽管我尝试启用std:c++latest和单独使用c++17,但我无法使用在c++17中添加的std::aligned_alloc()函数。这是真实的吗?Visual Studio 2019难道没有实现这个古老的标准功能(而且还是一个非常重要的功能)吗?有其他人可以确认吗?
我所指的功能是:

https://en.cppreference.com/w/cpp/memory/c/aligned_alloc

1个回答

6

来自针对VC++ 2019的Microsoft C++语言一致性表

C11 - 通用CRT实现了C++17所需的C11标准库部分,但不包括 C99 strftime() 中的E/O替代转换说明符,C11 fopen() 的独占模式和 C11 aligned_alloc()。后者可能不会被实现,因为C11以与Microsoft的free()实现不兼容的方式指定了aligned_alloc():即free()必须能够处理高度对齐的分配。

VC++具有特定于编译器的_aligned_malloc,用于将内存对齐到2的幂次方值,并参见在MS Visual Studio 2013中我可以使用什么代替std::aligned_alloc?


他们为什么不能将C++17的aligned_alloc()绑定到_aligned_malloc()上呢?为什么不遵循标准?Visual Studio C++现在基本上是另一种编程语言了。我真的需要制作一个自定义的alligned_alloc()函数,它在使用Visual Studio时绑定到_aligned_malloc(),在使用其他编译器时绑定到其他东西(即std::aligned_alloc,但也许现在没有人遵循标准了)吗? - Matias Chara
1
@MatiasChara 标准要求 aligned_alloc 返回的内存块与普通的 reallocfree 兼容。而 MSVC 的 _aligned_malloc 则需要使用 _aligned_realloc_aligned_free - dxiv
如果我想让我的代码可移植,我应该使用宏来交替使用std::aligned_alloc()和_aligned_malloc以及它们各自的free和realloc版本(当然,只需使用宏制作自己的函数来绑定这些)。对吗?_aligned_malloc和其相关函数只能在Windows中使用吗? - Matias Chara
这些是UCRT的一部分,这意味着只在Windows上适用。然而,问题不仅在于添加一些宏包装器。在std中,您可以编写一个函数char * double_string(char * str){return realloc(str,2 * strlen(str)+1);} 并调用相同的函数,无论str是从malloc还是aligned_alloc获取的。在MSVC中,您需要单独的函数。 - dxiv

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