gcc 编译器找不到“aligned_alloc”函数

yacmzcpb  于 2023-05-29  发布在  其他
关注(0)|答案(2)|浏览(393)

我尝试从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的工具链,但它没有。所以我想我不能接受提供的答案,直到我得到一个更具体的。

dsekswqp

dsekswqp1#

我没有使用macOS,但我在Linux上使用自定义g++也有类似的问题。如果您查看cstdlib标头,会看到类似于

#if __cplusplus >= 201703L && defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)
  using ::aligned_alloc;
#endif

所以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。

k4emjkb1

k4emjkb12#

正如公认的答案所提到的,使用boost::align::aligned_alloc解决了这个问题。
要在不修改源代码的情况下修复错误,只需在文件顶部添加以下内容:

#ifdef __APPLE__
#include <boost/align/aligned_alloc.hpp>
using boost::alignment::aligned_alloc;
#endif

相关问题