2014-10-07 7 views
3

구조체 멤버가 메모리에서 인접하지 않아도된다는 것을 읽었습니다. 이것은 다른 변수와 마찬가지로 메모리의 임의의 위치에있을 수 있다는 것을 의미합니까? 그렇다면 구조체를위한 공간을 할당하기 위해 malloc을 사용하지 않으면 스토리지가 많이 낭비되는 것입니까? 구조체 멤버를 올바르게 정렬하는구조체 요소에 대한 메모리 할당

+0

구조체에 A와 B의 두 멤버가있는 경우 컴파일러 또는 프로그래머가 패딩을 추가하지 않으면 A와 B가 모두 연속적으로 제공됩니다. – arunmoezhi

+0

@wallyk : 네 말이 맞아. 내 코멘트를 바 꾸었습니다 – arunmoezhi

+0

@arunmoezhi : 충분합니다. 내 의견을 삭제했습니다. – wallyk

답변

3

구성원은 반드시 연속적 일 필요는 없지만 임의의 메모리 위치에 있지는 않습니다. 예를 들어, 다음의 정의를 가지고 4 오프셋에 0 오프셋 bar

struct MyStruct 
{ 
    char foo; 
    int bar; 
}; 

sizeof(int) == 4 가정하고 foo 것 (적절하게 정렬 됨). 따라서 전체 구조는 5 바이트가 될 수 있지만 8 바이트가됩니다. 그러나 이러한 오프셋은이 구조의 모든 인스턴스에 대해 항상 동일합니다. 따라서 malloc에 대한 질문에 대답하려면 아니오, 공간을 낭비하지 않습니다.

같이까지 별도의 변수로서, 예, 메모리에 서로 다른 위치에 위치 할 수 있지만, 구조의 요점 그룹 관련 변수이다. 따라서 동일한 구조체 인스턴스의 모든 멤버가 밀접하게 그룹화됩니다.

3

는 CPU 아키텍처에 따라이 필요할 수 있습니다, 4 바이트 멤버의 예를 들면 주소는 어떤 CPU가 같은 정렬이 필요하지 않습니다 4로 나누어해야하지만, 많은 않습니다. 부적절하게 정렬 된 데이터로 처리하려고하면 일부 CPU가 충돌하고 다른 프로세서는 부적절하게 정렬 된 데이터에 대한 액세스가 훨씬 느려집니다.

어셈블러 프로그래머는이 문제에 대해 걱정할 필요가 있지만, C 프로그래머는 일반적으로 컴파일러에 지저분한 세부 사항을 남길 수 있습니다. 그러나 구조는 적절한 정렬을 보장하기 위해 "보이지 않는"패딩을 포함 할 수 있음을 의미합니다. 이 패딩은 많은 공간을 낭비하지 않으며 구조 멤버의 레이아웃을 적절히 조정하여 낭비되는 공간을 최소화 할 수 있습니다. 이 패딩은 함수에서 스택에 생성 된 변수에서도 발생합니다.

추가 정보를 위해, Data structure alignment를 참조하십시오.

관련 문제