GCC의 정렬된 malloc()?
GCC 또는 glibc에 정렬된 포인터에 메모리 블록을 할당하는 표준화된 기능이 있습니까?MSVC의 _align_malloc()처럼?
질문을 받은 이후 새로운 기능이 C11에 의해 표준화되었습니다.
void *aligned_alloc(size_t alignment, size_t size);
그리고 glibc에서 사용할 수 있습니다(제가 알기로는 윈도우에서는 사용할 수 없습니다).그것은 그것의 주장을 다음과 같은 순서로 받아들입니다.memalign
마이크로소프트의 반대._aligned_malloc
그리고 그것을 사용합니다.free
할당 해제를 위해 정상적으로 작동합니다.
미묘한 차이는aligned_alloc
을 요구합니다.size
의 배수가 되다alignment
.
memalign 함수 제품군을 참조하십시오.
[
posix_memalign()
][1] 함수는 정렬된 메모리 할당을 제공하며 glibc 2.1.91부터 사용할 수 있습니다.
그러나 다른 컴파일러에서는 그렇지 않습니다. "posix_memalign() 함수는 Advisory Information 옵션의 일부이며 모든 구현에서 제공될 필요는 없습니다."
있다_mm_malloc
그리고._mm_free
x86/x64 월드의 대부분의 컴파일러에서 지원하며, 최소한 다음과 같은 기능이 있습니다.
- gcc
- MinGW(gcc win32/win64)
- MSVC
- 달그락달그락
- ICC
AFAIK, 이러한 기능은 전혀 표준이 아닙니다.하지만 제가 아는 한 그것은 가장 지지를 받는 것입니다.다른 함수들은 컴파일러에 더 특화되어 있습니다.
- _aligned_malloc는 MSVC 및 MinGW 전용입니다.
- posix memalign 함수는 적어도 MSVC에서 지원되지 않습니다.
C11 표준 함수도 있지만 불행히도 C++11에는 없습니다. 그리고 C++에 포함시키려면 비표준 전처리기가 정의해야 합니다...
어떤 종류의 정렬을 기대하느냐에 따라 다릅니다.더 엄격한 정렬을 원하십니까, 아니면 더 편안한 정렬을 원하십니까?
malloc
정의에 따라 C 프로그램에 표준 유형을 저장하기 위해 적절하게 정렬된 포인터를 반환합니다(따라서 표준 유형에서 빌드된 모든 유형).그게 당신이 찾고 있는 것입니까?아니면 다른 것이 필요합니까?
C++17 이후로 표준 라이브러리 함수 std::aligned_alloc()가 있으며 서명은 다음과 같습니다.
void* aligned_alloc( std::size_t alignment, std::size_t size );
당신은 해야 한다.#include <cstdlib>
사용할 수 있습니다.그size
매개 변수는 다음의 배수여야 합니다.alignment
실패 시 null 포인터를 반환합니다.할당된 포인터는 std::free()를 사용하여 해제됩니다.
모든 컴파일러가 이 표준 기능을 구현한 것은 아닙니다.예를 들어 MSVC가 다음 이유로 이를 구현하지 않은 경우(여기에서 읽음):
MSVC는 aligned_alloc 함수를 지원하지 않습니다.C11은 microsoft의 free() 구현과 호환되지 않는 방식으로 aligned_alloc()를 지정했습니다. 즉, free()는 고도로 정렬된 할당을 처리할 수 있어야 합니다.
MSVC의 경우 _aligned_malloc() 및 _aligned_free()를 사용해야 합니다.
에는 이 표준이 있습니다.std::aligned_alloc()
적어도 Windows+Cygwin에서 테스트했습니다.
언급URL : https://stackoverflow.com/questions/3839922/aligned-malloc-in-gcc
'programing' 카테고리의 다른 글
JSON 시리즈화 Mongodb (0) | 2023.06.22 |
---|---|
아이폰의 반환 키를 키보드가 사라지게 만드는 방법은 무엇입니까? (0) | 2023.06.22 |
시계열 데이터베이스로서의 MongoDB (0) | 2023.06.22 |
wp-admin에서 페이지의 제목을 편집할 수 없도록 하려면 어떻게 해야 합니까? (0) | 2023.06.17 |
안드로이드 응용 프로그램에서 직접 Google Play Store를 여는 방법은 무엇입니까? (0) | 2023.06.17 |