Есть ли стандартизированная функция в GCC или glibc для выделения блока памяти по выровненному указателю? Как и _align_malloc() в MSVC?
Выровненный malloc() в GCC?
Ответ 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-программе (и, следовательно, любого типа, построенного из стандартных типов). Это то, что вы ищете? Или вам нужно что-то другое?