Компилятор не может найти функцию align_alloc - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь запустить пример кода из выровненного 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 Mojave, и это не решило проблему.Я надеялся, что он переустановит набор инструментов macOS, но этого не произошло.Поэтому я не могу принять предоставленные ответы, пока не получу более конкретный.

1 Ответ

0 голосов
/ 12 октября 2018

Я не использую macOS, но у меня возникают похожие проблемы с Linux, использующим пользовательский g ++.Если вы посмотрите на заголовок cstdlib, то увидите что-то вроде

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

Так что aligned_alloc втягивается в пространство имен std, только если доступен C ++ 17 и glibcxx поддерживает его.Вы можете проверить x86_64-linux-gnu/bits/c++config.h (или что-то подобное в macOS), если определено _GLIBCXX_HAVE_ALIGNED_ALLOC.Если нет, ваша версия glibc слишком старая.

Для clang и libc ++ возможна реализация aligned_alloc, если определено _LIBCPP_HAS_C11_FEATURES, что опять-таки зависит от недавней версии glibc.

КакВ качестве альтернативы вы можете использовать boost .

...