C 컴파일러 압축 문제
압축 수준은 동일한 방식으로 MIDL 및 Microsoft C/C++ 컴파일러 모두에 대한 형식의 메모리 레이아웃에 영향을 미칩니다. VC++로 정의된 빌드 환경 또는 SDK(플랫폼 소프트웨어 개발 키트)와 같은 Microsoft 빌드 환경에서 MIDL 및 C/C++ 컴파일러의 기본 압축 수준은 동일합니다. 32비트 및 64비트 Windows 빌드 환경의 기본 압축 수준은 8입니다.
자연 맞춤
메모리 형식의 경우 기본 맞춤은 자연 맞춤과 동일합니다.
- 약식, 부동 소수점 및 __int64 같은 기본 형식이며, 포인터의 표현이 모듈로 크기의 주소에서 시작되면 포인터가 자연스럽게 정렬됩니다. 현재 지원되는 모든 기본 형식의 크기는 1, 2, 4 또는 8입니다. 포인터의 크기는 32비트 환경에서는 4, 64비트 환경에서는 8입니다.
- 복합 형식은 각 구성 요소가 형식의 시작 부분을 기준으로 자연스럽게 정렬되고 구성 요소 간에 불필요한 간격(패딩)이 없는 경우 자연스럽게 정렬됩니다. 필드 또는 요소와 같은 복합 구성 요소는 포인터 또는 기본 형식 구성 요소로 재귀됩니다.
이 동작을 기억하는 데 도움이 되는 간단한 규칙은 형식의 자연 맞춤이 해당 구성 요소의 가장 큰 맞춤과 동일하다는 것입니다.
연산자 sizeof()로 표현된 대로 C 또는 C++ 및 IDL과 같은 언어에서 형식의 맞춤 및 메모리 크기 사이에 연결이 있습니다. 크기는 맞춤의 배수입니다(형식에 걸쳐 있는 최소 배수). 이는 메모리의 배열 표현에서 다음과 같습니다.
정렬되지 않은 데이터에 액세스하면 일부 시스템에서 예외가 발생할 수 있으므로 자연 맞춤이 중요합니다. 데이터가 잘못 정렬될 때 안전한 조작으로 표시될 수 있지만 일반적으로 일부 플랫폼에서 상당한 속도 저하가 발생할 수 있습니다.
참고
메모리에서 n의 자연 맞춤이 있는 형식의 개체는 n의 배수인 주소에 배치될 때 제대로 정렬되도록 보장됩니다.
압축 및 맞춤
형식의 자연 맞춤보다 큰 압축 수준을 지정해도 형식 맞춤은 변경되지 않습니다. 기본 맞춤보다 작은 압축 수준을 지정하면 형식 맞춤이 압축 수준으로 줄어듭니다. 결과적으로 압축된 형식은 정렬이 잘못되지 않고 압축 수준(축소된 맞춤)의 배수인 주소에서 메모리에 배치될 수 있습니다. 이는 단순 형식과 구성 요소 형식 모두에 영향을 줍니다. 복합 형식의 경우 구성 요소의 맞춤이 감소하면 구성 요소의 적절한 맞춤에 필요한 안쪽 여백 크기가 변경되어 형식의 크기가 줄어들 수 있으므로 형식의 내부 레이아웃이 영향을 받을 수 있습니다.
이 동작을 기억하는 데 도움이 되는 간단한 규칙은 압축된 형식의 새 맞춤이 압축 수준과 자연 맞춤의 작은 맞춤이라는 것입니다. 형식의 크기는 새 맞춤의 배수입니다. sizeof() 연산자는 압축된 형식의 축소된 크기를 반환합니다.
예를 들어 압축 수준 2를 사용하면 긴 길이가 2에 맞춰지므로 자연 맞춤의 경우처럼 4의 배수인 주소뿐만 아니라 임의의 짝수 주소에 배치될 수 있습니다. 짧고 길이가 2로 압축된 구조체는 자연 맞춤에 필요한 짧음과 다음 길이 사이의 내부 간격이 필요하지 않습니다. 따라서 구조체가 이제 2로 정렬될 뿐만 아니라 크기가 8에서 6으로 줄어듭니다.
예를 들어 1바이트 문자, 정수 4바이트 길이 및 1바이트 문자로 구성된 복합 형식을 고려합니다.
struct mystructtype
{
char c1; /* requires 1 byte */
/* 3 bytes of padding with natural alignment only */
long l2; /* requires 4 bytes */
char c3; /* requires 1 byte */
/* 3 bytes of padding with natural alignment only */
} mystruct;
이 구조체는 자연적으로 4로 정렬되며 자연 크기는 12입니다.
압축 수준 4 이상의 경우 구조 체 mystruct 는 4에 정렬되고 12와 sizeof(struct mystructtype)
같습니다. 4의 배수가 아닌 주소의 메모리에 있는 경우 구조체가 잘못 정렬됩니다.
압축 수준 2의 경우 구조체는 2로 정렬되고 크기는 8입니다. 2의 배수가 아닌 주소의 메모리에 있는 경우 수준 2로 압축된 구조체가 잘못 정렬됩니다.
압축 수준 1의 경우 구조체는 1로 정렬되고 크기는 6입니다. 수준 1로 압축된 구조체는 잘못된 정렬 오류를 일으키지 않고 어디에나 배치할 수 있습니다.
관련 항목