dx관련 alignment 정리 by 은자림
DESCRIPTION
NHN NEXT Game Track Directx 관련 alignment setting 정리TRANSCRIPT
char, short, int, float, double우리는 여러자료형을 상황에맞게 쓴다그것들이 CPU로 전달 될땐 어떻게 될까?
1단계(100원)
1번 각 자료형 크기에 따라 가변적으로 보내진다2번 정해진 크기로 묶어서 보내진다
==
정답: 2번위 사진처럼정해진 alignment로자동으로맞춰져 보내진다
이때 complier에서 자동으로더해진영역을 padding이라함
당연히 개별크기로 보내는 것 보다 ‘성능’이 좋기 때문에한다!메모리가 자원인데 자원 낭비도 아니고 이유 없이 할 이유가..
그래도 저 메모리너무 아깝다...위 사진만 봐도 무려 4바이트가날아갔네ㅠㅠ
문제2: 저 메모리를챙기는방법은?(1000원)
1번 packing2번 pragma
정답: 1번Packing을통해 메모리를꽉꽉 채워 내보낼수 있음
자동 padding은 compile에 따라 방식이 다를 수 있어코드 호환성이떨어지는경우가 있다packing시일반적으로성능 효율은떨어진다
#pragma pack(push) //packing 시작#pragma pack(4) //숫자…#pragma pack(pop) //packing 끝
여기까지일반 상식...
이번에 문제가되었던D3DMATRIX16A는 오히려 alignment를요구했다error C2719: 'matView': formal parameter with __declspec(align('16')) won't be aligned해석) 16바이트로 align으로안했네? You error
왜?아니 D3D면성능이 당연히 중요할 텐데 성능 이슈가 있는 요구를 왜 아오$#@@$!@??
는 훼이크닷!
마소(MS)느님께서언제 틀렸던적이 있었나...D3DMATRIX16A연산에는 오히려 align16이성능의답이었다
Intel의 SSE, AMD의 3DNow! 등SIMD instruction을사용하는경우 보다 나은 성능
메모리로부터 SSE에서사용하는 XMM 레지스터로의데이터 로딩시16Byte 단위로정렬된 데이터가필요하다
SSE(Streaming SIMD Extensions)
실수연산에최적화된명령어 set개발자들에게 3D 그래픽 생성과핸들링을위한 실수연산에있어병행처리프로그램을지원
펜티엄-Ⅲ의혁신적이었던... 기술
요 SSE의 전용처리 레지스터가 128bit(16byte)
그래서 매트릭스연산에사용되는D3DMATIRX16A은 16byte로강제 align
placement new(위치지정 new)
엇?! Effective C++에서 나온 느낌이…
operator newmalloc과 같다. 인자로 넣어준사이즈만큼할당, 메모리주소 리턴원형은 void* operator new(size_t size); 이다.
사용 예)void* pTest = operator new(sizeof(TestClass));
placement new인자로메모리가할당 되어 있는포인터를 넘겨주면, 지정 된 메모리공간을 리턴내부적으로 void* operator new(size_t, void*) 호출
사용예)void* pTest = malloc(sizeof(TestClass));new(pTest) TestClass;
언제 쓰나?
메모리를재할당 하지 않으므로, 기존 데이터가그대로남아있고,생성자에서초기화하는데이터만초기화.가상함수테이블을초기화시킨다
문법상명시적으로생성자를호출할수없을때,placement new를사용해서생성자를호출 할 수 있다.
오브젝트풀 등에서 활용 할 수 있다.사용된 메모리를 free하지않고 풀에 담아 두고 할당이 필요할때,풀에가용메모리가있으면할당하지않고초기화만해서사용한다.