programing

GCC의 정렬된 malloc()?

powerit 2023. 6. 22. 22:30
반응형

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_freex86/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

반응형