구조체 멤버가 메모리에서 인접하지 않아도된다는 것을 읽었습니다. 이것은 다른 변수와 마찬가지로 메모리의 임의의 위치에있을 수 있다는 것을 의미합니까? 그렇다면 구조체를위한 공간을 할당하기 위해 malloc을 사용하지 않으면 스토리지가 많이 낭비되는 것입니까? 구조체 멤버를 올바르게 정렬하는구조체 요소에 대한 메모리 할당
답변
구성원은 반드시 연속적 일 필요는 없지만 임의의 메모리 위치에 있지는 않습니다. 예를 들어, 다음의 정의를 가지고 4 오프셋에 0 오프셋 bar
에
struct MyStruct
{
char foo;
int bar;
};
는 sizeof(int) == 4
가정하고 foo
것 (적절하게 정렬 됨). 따라서 전체 구조는 5 바이트가 될 수 있지만 8 바이트가됩니다. 그러나 이러한 오프셋은이 구조의 모든 인스턴스에 대해 항상 동일합니다. 따라서 malloc
에 대한 질문에 대답하려면 아니오, 공간을 낭비하지 않습니다.
같이까지 별도의 변수로서, 예, 메모리에 서로 다른 위치에 위치 할 수 있지만, 구조의 요점 그룹 관련 변수이다. 따라서 동일한 구조체 인스턴스의 모든 멤버가 밀접하게 그룹화됩니다.
는 CPU 아키텍처에 따라이 필요할 수 있습니다, 4 바이트 멤버의 예를 들면 주소는 어떤 CPU가 같은 정렬이 필요하지 않습니다 4로 나누어해야하지만, 많은 않습니다. 부적절하게 정렬 된 데이터로 처리하려고하면 일부 CPU가 충돌하고 다른 프로세서는 부적절하게 정렬 된 데이터에 대한 액세스가 훨씬 느려집니다.
어셈블러 프로그래머는이 문제에 대해 걱정할 필요가 있지만, C 프로그래머는 일반적으로 컴파일러에 지저분한 세부 사항을 남길 수 있습니다. 그러나 구조는 적절한 정렬을 보장하기 위해 "보이지 않는"패딩을 포함 할 수 있음을 의미합니다. 이 패딩은 많은 공간을 낭비하지 않으며 구조 멤버의 레이아웃을 적절히 조정하여 낭비되는 공간을 최소화 할 수 있습니다. 이 패딩은 함수에서 스택에 생성 된 변수에서도 발생합니다.
추가 정보를 위해, Data structure alignment를 참조하십시오.
- 1. 구조체 요소에 문자열 할당
- 2. Segfault. 구조체 내에서 구조체에 대한 메모리 할당
- 3. 구조체 내부의 문자열에 메모리 할당
- 4. 중첩 된 구조체 할당 메모리
- 5. 구조체 내의 배열에 메모리 할당
- 6. 구조체 내에서 배열의 동적 메모리 할당
- 7. 구조체 포인터 캐스팅 및 해당 메모리 할당
- 8. CUDA에서 정적으로 할당 된 전역 메모리 구조체
- 9. 행렬에 대한 메모리 할당
- 10. 예외에 대한 메모리 할당
- 11. 메모리 가비지 pj_str 구조체
- 12. 배열 요소에 C 변수 할당
- 13. 일체형 구조의 메모리 할당
- 14. 구조체 epoll_event를 사용한 메모리 처리
- 15. 배열을 사용하여 구조체 요소에 대한 입력 처리
- 16. 구조체 배열의 모든 요소에 대한 뮤텍스
- 17. auto_ptr에 대한 동적 메모리 할당
- 18. .NET의 컬렉션에 대한 메모리 할당
- 19. 객체 배열에 대한 메모리 할당
- 20. Arraylists에 대한 동적 메모리 할당?
- 21. 배열에 대한 C++ 메모리 할당
- 22. 객체에 대한 동적 메모리 할당
- 23. 구조체 속성에 대한 할당 종속성을 지정하는 방법
- 24. 구조체 배열의 동적 할당
- 25. C 무효 포인터에 대한 동적 메모리 할당
- 26. QML 요소에 대한 Qt 메모리 관리
- 27. 동적으로 할당 된 구조체 (배열 구조체)에 동적 배열 할당
- 28. C 구조체 변수 할당?
- 29. 구조체 포인터의 배열을 할당 하시겠습니까?
- 30. 정적 배열에 구조체 할당
구조체에 A와 B의 두 멤버가있는 경우 컴파일러 또는 프로그래머가 패딩을 추가하지 않으면 A와 B가 모두 연속적으로 제공됩니다. – arunmoezhi
@wallyk : 네 말이 맞아. 내 코멘트를 바 꾸었습니다 – arunmoezhi
@arunmoezhi : 충분합니다. 내 의견을 삭제했습니다. – wallyk