выровнял malloc () в GCC? - PullRequest
       32

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

34 голосов
/ 01 октября 2010

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

Ответы [ 5 ]

29 голосов
/ 01 февраля 2013

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

void *aligned_alloc(size_t alignment, size_t size);

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

Тонкое отличие состоит в том, что aligned_alloc требует size, кратное alignment.

29 голосов
/ 01 октября 2010

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

19 голосов
/ 01 октября 2010

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

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

11 голосов
/ 25 января 2016

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

  • gcc
  • MinGW (gcc win32 /win64)
  • MSVC
  • clang
  • ICC

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

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

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

4 голосов
/ 01 октября 2010

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

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

...