Подтвердить что ты не робот

Выровненный malloc() в GCC?

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

4b9b3361

Ответ 1

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

Ответ 2

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

void *aligned_alloc(size_t alignment, size_t size);

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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