2012-06-25 6 views
0

동적으로 할당 된 메모리 대 시간을 컴파일구조의 메모리 정렬 내가이 문을 발견 할 때 난 그냥 설명에 대한 <strong>posix_memalign</strong> 기능에 대한 glibc는 설명서를 통과했다

malloc과 realloc에 ​​의해 반환되는 블럭의 주소 GNU 시스템에서 항상 은 8의 배수 (또는 64 비트 시스템에서는 16 개)입니다. 주소가 보다 큰 2의 배수가되는 블록이 필요하면 memalign, posix_memalign 또는 valloc을 사용하십시오.

I 방금 int 데이터의 부재를 포함하는 단순한 구조를 고려할 경우

struct Mystruct 
{ 
int member; 
}; 

그럼 I MYSTRUCT가 정렬 된 4 바이트가되어야한다고 볼 수있다. 그러나 64 비트 아키텍처의 libc 매뉴얼에 따르면 동적으로 그러한 구조체에 메모리를 할당하면 16 바이트 정렬의 주소에 할당 된 메모리가 반환됩니다. 만약 내가 잘못

저를 수정합니다. 내게는 컴파일러가 전역/정적/자동 변수 (데이터, bss, 스택)에 대해서만 구조체의 자연 정렬을 사용하는 것처럼 보입니다. 그러나 힙 메모리에 같은 구조체를 할당하기 위해 malloc 호출은 미리 정의 된 정렬 (32 비트 아키텍처에서는 8 개, 64 비트 아키텍처에서는 16 개)을 사용합니다.

답변

0

기억할 가치가있는 한 가지는 malloc()이 마술 적이라는 것입니다. 이것은 단지 함수입니다. 마찬가지로, 힙은 컴파일러가 그 내용을 만지지 않기로 약속 한 메모리 다. 정적으로 (스택 또는 데이터/bss에) 할당하는 것은 컴파일러 이 수행하는 것인데, 어떤 정렬이 지정 되더라도 정렬 할 수 있습니다.. malloc() (및 관련 함수)은 힙을 관리하는 함수이지만 런타임에 호출됩니다. 컴파일러는 malloc()이 함수라는 것을 제외하고는 malloc()에 대해 아무 것도 모릅니다. malloc()은 여러분이 요구하는 것을 제외하고 할당을 요청하는 메모리에 대해 아무것도 모릅니다. 16 비트 정렬은 일반적으로 가장 일반적으로 사용되기 때문에 malloc()은이 정렬을 안전하게 유지합니다.

추 신 : 재미 있고 (눈을 뜨게하는) 운동은 자신의 malloc() 구현을 작성하는 것입니다.