구조체의 객체는 선언된 순서대로 멤버를 보유한다. 예를 들면 다음과 같다.
struct Readout {
char hour; // [0:23]
int value;
char seq; // sequence mark ['a':'z']
};
다음과 같이 메모리에 배치된 Readout 객체의 멤버를 상상할 수 있다.
멤버는 선언 순서대로 메모리에 할당되므로 시간의 주소는 값의 주소보다 작아야 한다. 그러나 구조체의 객체 크기가 반드시 해당 멤버 크기의 합일 필요는 없다. 이는 많은 machine이 특정 유형의 객체가 아키텍처의 종속 경계에 할당되거나 그러한 객체가 있는 경우 훨씬 더 효율적으로 처리해야 하기 때문이다.
예를 들면 정수는 종종 단어 word의 경계에 할당된다. 이러한 machine에서 객체는 적절하게 정렬되어야 한다. 이는 구조물에 "holes"를 만든다. 4byte int가 있는 시스템에서 Readout의 보다 현실적인 레이아웃은 다음과 같다.
이 경우 많은 machine에서와 같이 sizeof(Readout)는 12이고 단순히 개별 멤버의 크기를 추가하는 것으로부터 단순하게 예상할 수 있는 6이 아니다. 단순히 크기 별로 멤버를 나열하는 것으로 낭비되는 공간을 최소화할 수 있다.
struct Readout {
int value;
char hour; // [0:23]
char seq; // sequence mark ['a':'z']
};
이것은 다음과 같다.
이것은 여전히 Readout 및 sizeof(Readout) == 8에 2byte 'holes'(사용되지 않는 공간)을 남긴다. 그 이유는 예를 들어 Readout 배열에서 두 객체를 나란히 놓을 때 정렬을 유지해야 하기 때문이다. 10개의 Readout 객체 배열의 크기는 10 * sizeof(Readout)이다.
일반적으로 가독성을 위해 멤버를 정렬하고 최적화가 필요한 경우에만 크기별로 정렬하는 것이 가장 좋다. 다중 액세스 지정자 (e.g. public, private or protected)를 사용하면 레이아웃에 영향을 줄 수 있다.
'Program Language > C & C++' 카테고리의 다른 글
[C++] 구조체와 클래스 (0) | 2022.01.03 |
---|---|
[C++] 구조체 이름 (0) | 2022.01.03 |
[C++] 구조체 (structure) (0) | 2021.12.29 |
[C++] 포인터와 참조 (1) | 2021.12.29 |
[C++] 참조에 대한 참조 (0) | 2021.12.29 |