2. align
__declspec(align(#))를 사용하여 사용자 정의 데이터를 정확하게 제어한다.
#은 alignment할 값이다. (2, 4, 8, 16, 32, 64 등과 같이 1에서 8192(바이트) 사이에 속하는 2의 정
수 제곱값이다.)
3. 왜 align?
__declspec(align(#))을 사용하지 않으면 VC++가 알아서 alignmet
새로운 명령을 사용할 때 데이터를 16바이트 경계에 맞춰야 하는 경우가 많다.(당장
D3DXMATRIXA16만 봐도 그렇다.)
자주 사용하는 데이터를 특정 프로세서의 캐시 줄 크기에 맞춤으로써 캐시 성능이 향상된다.
4. Visual C++ alignment 규칙
#define CACHE_LINE 32
#define CACHE_ALIGH __declspec(align(CACHE_LINE))
struct CACHE_ALIGN S1 {
int a, b, c, d;
};
sizeof(struct S1)은 32. 16 padding byte가 추가된다.
구조체 멤버는 int 멤버에 맞게 4byte alignment되어야 하지만 구조체를 32byte로 align 했기 때문
5. Visual C++ alignment 규칙
__declspec(align(8)) struct S2 {
int a, b, c, d;
};
sizeof(struct S2)는 align(8)의 배수로 맞춰서 16이 된다.
6. Visual C++ alignment 규칙
struct S3는 struct S1의 alignment를 따른다.
struct S3 {
struct S1 s1;
int a;
};
sizeof(struct S3)은 32(s1) + 32(int a + 28 padding byte)가 된다.
7. D3DXMATRIXA16 structure
A 4x4, 16-byte-aligned matrix that contains methods and operator overloads.
16-byte-aligned에 주목하면 되겠다.
D3DX에서 vector와 quaternion은 align되지 않는다.
그래서 D3DX math를 가지고 vector, quaternion을 사용할 때는 __declspec(align(16))을 해서
해주어야 한다. 성능이 향상된다고 한다.
#define D3DX_ALIGN16 __declspec(align(16))