Выровнял 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.