Выровнял malloc() в GCC?

Есть ли стандартизированная функция в GCC или glibc для выделения блока памяти по выровненному указателю? Как _align_malloc() в MSVC?

6 ответов

Решение

Смотрите семейное семейство функций.

Так как вопрос был задан, новая функция была стандартизирована C11:

void *aligned_alloc(size_t alignment, size_t size);

и это доступно в glibc (не на окнах, насколько я знаю). Он принимает свои аргументы в том же порядке, что и memalign, противоположность Microsoft _aligned_mallocи использует то же самое free функционировать как обычно для освобождения.

[posix_memalign()] [1] обеспечивает выравнивание выделенной памяти и доступна с glibc 2.1.91.

Но не обязательно с другими компиляторами: цитирование стандарта: "Функция posix_memalign() является частью опции" Консультативная информация "и не обязательно должна предоставляться во всех реализациях".

Есть _mm_malloc а также _mm_free которые поддерживаются большинством компиляторов мира x86/x64, по крайней мере:

  • НКУ
  • MinGW (gcc win32 / win64)
  • MSVC
  • лязг
  • ICC

AFAIK, эти функции не являются стандартом вообще. Но это, насколько мне известно, наиболее поддерживаемые. Другие функции более специфичны для компилятора:

  • _aligned_malloc - только MSVC и MinGW
  • функции posix memalign не поддерживаются, по крайней мере, MSVC

Существуют также стандартные функции C11, но, к сожалению, их нет в C++11, и для их включения в C++ требуются нестандартные определения препроцессора...

Это зависит от того, какой тип выравнивания вы ожидаете. Вы хотите более строгое выравнивание или более спокойное выравнивание?

malloc по определению гарантированно возвращает указатель, который выровнен должным образом для хранения любого стандартного типа в C-программе (и, следовательно, любого типа, построенного из стандартных типов). Это то, что вы ищете? Или тебе нужно что-то другое?

Начиная с C++17 существует стандартная библиотечная функция std ::align_alloc() с подписью:

      void* aligned_alloc( std::size_t alignment, std::size_t size );

Ты должен #include <cstdlib>использовать это. В size параметр должен быть кратным alignment. При ошибке возвращает нулевой указатель. Выделенный указатель освобождается с помощью std :: free ().

Хотя не все компиляторы могли реализовать эту стандартную функцию. Например, MSVC не реализовал его по следующей причине (читайте здесь ):

MSVC не поддерживает функцию align_alloc. В C11 указано align_alloc() способом, несовместимым с реализацией free () Microsoft, а именно, что free () должен иметь возможность обрабатывать сильно выровненные выделения.

Для MSVC необходимо использовать _aligned_malloc () и _aligned_free().

Но в GCC / G++ есть этот стандарт std::aligned_alloc(), по крайней мере, я тестировал это на Windows+Cygwin.

Другие вопросы по тегам