- 2011/11/11 05:34
- nicegary.egloos.com/4644229
- 덧글수 : 0
- 2011/11/11 05:29
- nicegary.egloos.com/4644227
- 덧글수 : 0
Microsoft Specific
align(#)
사용자정의 데이터를 정밀하게 정렬하는데 사용되며, 더불어 자주 사용되는 데이터를 특정 프로세서의 캐시라인 크기로 정렬해 캐시성능을 높인다. #은 정렬값으로 1부터 8192 (바이트) 까지 2의 거듭제곱 수. 즉 2, 4, 8, 16, 32, 64.
Visual C++은 기본적으로 데이터 크기에 따라 natural boundary에 데이터를 정렬한다. 가령 4바이트 정수는 4바이트 경계, 8바이트 더블은 8바이트 경계에 정렬되며, 클래스 또는 구조체내 데이터들은 natural alignment와 현재 packing 설정 (#pragma pack(n)또는 /Zp 컴파일러 옵션) 중 작은 값으로 클래스 또는 구조체 안에 정렬된다. 이 구문은 struct, union, class 정의나 변수 선언시 사용할 수 있지만, 함수 매개변수 (즉 스택변수) 에는 사용할 수 없다.
참고 특정 타입의 기본 정렬값(size_t)을 알려면 __alignof(CE3.0), 64비트 프로세서를 타겟으로 할 때 정렬되지 않은 포인터를 선언하려면 __unaligned(CE5.0) 참조.
요약하자면:
- __declspec(align(#))이 사용되지 않으면, 스칼라 구조체 멤버의 정렬값은 멤버 크기와
현재 packing 중 작은 값이며, 구조체의 정렬값은 각 멤버 정렬값 중 가장 큰 값
- 구조체 멤버는 구조체 시작 오프셋에서 이전 멤버의 끝 오프셋까지보다 크거나 같은 가장 작은
정렬 배수값에 위치한다.
- 구조체 크기는 마지막 멤버의 끝 오프셋보다 크거나 같은 가장 작은 정렬 배수값이다.
베이스가 올바르게 정렬된 배열을 만들려면, _aligned_malloc(VC.NET) 또는 자신의 할당자를 작성하도록 한다. malloc(VC6), C++ 연산자 new(VC.NET), Win32 할당자 같은 보통 할당자는 십중팔구 __declspec(align(#)) 구조체 또는 구조체 배열에 맞게 충분히 정렬되지 않을 메모리를 리턴한다.
구조체의 sizeof 값은 "가장 큰 멤버 정렬값의 가장 가까운 배수로 채워지는 마지막 멤버의 오프셋 + 마지막 멤버의 크기" vs. "완전한 구조체 정렬값" 중 큰 값이다.
메모리가 힙에 할당되었을 때의 정렬은 호출된 할당함수에 의존한다. 가령 malloc을 사용하면, 그 결과는 피연산자 크기에 따라 다르다. arg >= 8이면 8바이트, arg < 8이면 arg 이하의 2 제곱수에 정렬된다. 즉 malloc(7)을 사용하면, 4바이트 정렬된다.
__declspec(align(#))을 이용한 새로운 타입 정의
이제 aType과 bType은 같은 크기 (8 바이트) 지만, bType 변수들은 32바이트 정렬된다.
TLS(thread-local storage)내 데이터 정렬
__declspec(align(#))으로 생성되고 이미지의 .tls 섹션에 놓인 TLS(스레드에 유일한 데이터 저장소)는 일반적인 정적데이터와 똑같이 정렬된다. OS는 .tls 섹션 크기만큼 데이터를 할당하고 .tls 섹션 정렬 속성을 고려해 TLS 데이터를 생성한다. 다음은 TLS에 정렬된 데이터를 놓는 다양한 방법들이다.
데이터 packing과 정렬
/Zp 컴파일러 옵션과 pack pragma는 구조체와 union 멤버 데이터를 packing하는 효과가 있다. 다음은 /Zp 옵션과__declspec(align(#))을 같이 사용한 예와 다양한 /Zp (또는 #pragma pack) 조건에서 각 멤버의 오프셋이다.
세부사항은 /Zp (구조체 멤버 정렬)(VC.NET) 참조.
따라서 객체의 오프셋은 객체가 __declspec(align(#)) 속성을 갖지 않으면, 이전 객체의 오프셋과 현재 packing 설정에 따라 결정되며, 그렇지 않으면 이전 객체의 오프셋과 객체의 __declspec(align(#)) 값에 따라 결정된다.
End Microsoft Specific
- 2011/11/09 19:28
- nicegary.egloos.com/4643655
- 덧글수 : 0
- 2011/11/09 18:07
- nicegary.egloos.com/4643636
- 덧글수 : 0
- 2011/11/07 21:51
- nicegary.egloos.com/4642985
- 덧글수 : 0
- 2011/10/02 03:16
- nicegary.egloos.com/4629769
- 덧글수 : 0




최근 덧글