我尝试从aligned alloc启动示例代码:
#include <cstdio>
#include <cstdlib>
int main()
{
int* p1 = static_cast<int*>(std::malloc(10*sizeof *p1));
std::printf("default-aligned address: %p\n", static_cast<void*>(p1));
std::free(p1);
int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
std::free(p2);
}
我的编译器给予了我这个错误:
$ g++-mp-8 main.cpp -std=c++17
main.cpp:10:38: error: no member named 'aligned_alloc' in namespace 'std'
int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
我正在使用macOS High Sierra 10.13.6,并尝试使用Macport的GCC 7.3.0,8.2.0和CLang(Apple LLVM版本10.0.0)编译此代码,它们都产生相同的错误。
编辑:无论std::
是否存在,它都不起作用。
Edit2:我安装了macOS莫哈韦,但没有解决这个问题。我希望它会重新安装macOS的工具链,但它没有。所以我想我不能接受提供的答案,直到我得到一个更具体的。
2条答案
按热度按时间dsekswqp1#
我没有使用macOS,但我在Linux上使用自定义g++也有类似的问题。如果您查看
cstdlib
标头,会看到类似于所以
aligned_alloc
只有在C17可用并且glibcxx支持的情况下才会被拉入std
命名空间。如果定义了_GLIBCXX_HAVE_ALIGNED_ALLOC
,则可以检查x86_64-linux-gnu/bits/c++config.h
(或macOS上的类似内容)。如果不是,你的glibc版本太旧了。对于clang和libc实现,如果定义了
_LIBCPP_HAS_C11_FEATURES
,则aligned_alloc
可用,这同样取决于glibc的最新版本。作为替代,您可以使用boost。
k4emjkb12#
正如公认的答案所提到的,使用
boost::align::aligned_alloc
解决了这个问题。要在不修改源代码的情况下修复错误,只需在文件顶部添加以下内容: