글수 69
하얀_고양이님의 글을 읽다가 메모리 복사 함수의 인라인 어셈블리 버전이나 만들어볼까 하다가...
아무 의미 없길래 -_- (어차피 VC++에선 memcpy도 어셈으로 되어 있고...)
템플릿 버전으로 만들어보게 되었습니다.
...일단 그래서 속도야 빠른 것 같습니다.
그런데 거의 매크로급이라 크기는 팍팍 불어나네요.
(하얀_고양이님의 글: http://beeswing.net/zeroboard/zboard.php?id=lec_general&no=45 )
[code]
template <int size>
inline void _CopyMem(void *dest, void *src)
{
# pragma pack(push) // #pragma pack 구문은 없어도 상관 없는 것 같음
# pragma pack(1)
struct dummy {
char __unused[size];
} ;
*(dummy *)dest = *(dummy *)src;
# pragma pack(pop)
}
#define CopyMem(dest, src, size) _CopyMem<size>((dest), (src))
[/code]
일단 만들어내는 결과 코드가 너무 감동적이더군요(?)
[code]
template <int size>
inline void _ZeroMem(void *dest)
{
for (int i=0; i<size; i++) {
((char *)dest)[i] = 0;
}
}
#define ZeroMem(dest, size) _ZeroMem<size>((dest))
[/code]
위 코드는 다음과 같은 장점이 있습니다:
1. Release 모드에서 컴파일 하면 함수 호출이고 뭐고 일어나지도 않습니다.
2. 상황에 따라 적절하게 rep movs/stos나 mov 명령어 몇 십개 나열로 처리됩니다.
=> 무식한 for로 처리해도 알아서 다 최적해주는 VC++의 세심한 배려(?)에 감동
단점은 더 무시무시합니다:
1. 결과 코드를 굉장히 꼽니다. (루틴 한 부분으로 딱 떨어지는게 아니고 다른 루틴 중간 중간에 섞여서 나옵니다. -_-)
2. size 인수에 상수만 쓸 수 있습니다. -_-
결론: 단점 2 때문에 또 무용지물 -_-;;;
그나마 ZeroMem은 size 부분에 상수 쓸 일이 많아 어쩌다 쓸 수 있을지도 모르겠네요.
대부분 구조체 초기화에 쓸 것 같은데...
솔직히 이런거 쓰느니 그냥 {0, } 으로 초기화 하는게 낫겠군요 -_-;
아무 의미 없길래 -_- (어차피 VC++에선 memcpy도 어셈으로 되어 있고...)
템플릿 버전으로 만들어보게 되었습니다.
...일단 그래서 속도야 빠른 것 같습니다.
그런데 거의 매크로급이라 크기는 팍팍 불어나네요.
(하얀_고양이님의 글: http://beeswing.net/zeroboard/zboard.php?id=lec_general&no=45 )
[code]
template <int size>
inline void _CopyMem(void *dest, void *src)
{
# pragma pack(push) // #pragma pack 구문은 없어도 상관 없는 것 같음
# pragma pack(1)
struct dummy {
char __unused[size];
} ;
*(dummy *)dest = *(dummy *)src;
# pragma pack(pop)
}
#define CopyMem(dest, src, size) _CopyMem<size>((dest), (src))
[/code]
일단 만들어내는 결과 코드가 너무 감동적이더군요(?)
[code]
template <int size>
inline void _ZeroMem(void *dest)
{
for (int i=0; i<size; i++) {
((char *)dest)[i] = 0;
}
}
#define ZeroMem(dest, size) _ZeroMem<size>((dest))
[/code]
위 코드는 다음과 같은 장점이 있습니다:
1. Release 모드에서 컴파일 하면 함수 호출이고 뭐고 일어나지도 않습니다.
2. 상황에 따라 적절하게 rep movs/stos나 mov 명령어 몇 십개 나열로 처리됩니다.
=> 무식한 for로 처리해도 알아서 다 최적해주는 VC++의 세심한 배려(?)에 감동
단점은 더 무시무시합니다:
1. 결과 코드를 굉장히 꼽니다. (루틴 한 부분으로 딱 떨어지는게 아니고 다른 루틴 중간 중간에 섞여서 나옵니다. -_-)
2. size 인수에 상수만 쓸 수 있습니다. -_-
결론: 단점 2 때문에 또 무용지물 -_-;;;
그나마 ZeroMem은 size 부분에 상수 쓸 일이 많아 어쩌다 쓸 수 있을지도 모르겠네요.
대부분 구조체 초기화에 쓸 것 같은데...
솔직히 이런거 쓰느니 그냥 {0, } 으로 초기화 하는게 낫겠군요 -_-;
