最速のメモリのSwap方法!?

どうも。id:studiokingyoです。
最速のスワップ方法について研究していました。
で、出来たソースが以下

///正統派 整数、実数専用スワップ
#define SWAP_NUM(a,b) \
a = b - a ;\
b -= a ;\
a += b

inline void dkcSwapByte(BYTE *p1,BYTE *p2,size_t size){
for(size_t i=0;i<size;i++){
SWAP_NUM(p1[i],p2[i]);
}
}
void WINAPI dkcSwap(void *p1,void *p2,size_t size)
{
void *p = dkcAllocate(size);//malloc
dkcmNOT_ASSERT(NULL==p);//assertの逆版
memcpy(p,p1,size);
memcpy(p1,p2,size);
memcpy(p2,p,size);
dkcFree(&p);//free
}


template<typename TYPE_T>
inline void dkcSwapT(TYPE_T *p1,TYPE_T *p2,size_t size){
size_t i;
char buf;
size_t mod_ = size % sizeof(TYPE_T);
size_t cnt = size / sizeof(TYPE_T);
for(i=0;i<cnt;i++){
SWAP_NUM(p1[i],p2[i]);
}
for(i=0;i<mod_;i++){
buf = (((BYTE *)p1)[size - mod_ + i]);
(((BYTE *)p1)[size - mod_ + i]) =
(((BYTE *)p2)[size - mod_ + i]) ;
(((BYTE *)p2)[size - mod_ + i]) = buf;
}

}


void WINAPI dkcSwapFast(int *p1,int *p2,size_t size)
{
size_t i;
char buf;
size_t mod_ = size % sizeof(int);
size_t cnt = size / sizeof(int);
for(i=0;i<cnt;i++){
SWAP_NUM(p1[i],p2[i]);
}
for(i=0;i<mod_;i++){
buf = (((BYTE *)p1)[size - mod_ + i]);
(((BYTE *)p1)[size - mod_ + i]) =
(((BYTE *)p2)[size - mod_ + i]) ;
(((BYTE *)p2)[size - mod_ + i]) = buf;
}
}

void WINAPI dkcSwap64(ULONGLONG *p1,ULONGLONG *p2,size_t size){
size_t i;
char buf;
size_t mod_ = size % sizeof(ULONGLONG);
size_t cnt = size / sizeof(ULONGLONG);
for(i=0;i<cnt;i++){
SWAP_NUM(p1[i],p2[i]);
}
for(i=0;i<mod_;i++){
buf = (((BYTE *)p1)[size - mod_ + i]);
(((BYTE *)p1)[size - mod_ + i]) =
(((BYTE *)p2)[size - mod_ + i]) ;
(((BYTE *)p2)[size - mod_ + i]) = buf;
}

}

このスワッププログラムコンテストを見事に制したのが
dkcSwap64関数でした。

ちと、独自の関数とかが混じっててソース醜いかもしれませんが、勘弁( >Д<;)

ちなみにdkcSwap()は一番重かった。メモリを確保しているのがやばいのか?
dkcSwap64()とdkcSwapFast()はあまり変わらなかった。
dkcSwapByte()は普通レベル。dkcSwapTは変なテンプレート 以上!ソース解説おしまい。

プログラミングの参考になれば幸いです。

もし、もっと速いスワップの方法がありましたら是非ともコメントお願いします。M(_ _)m

2004/10/18:ソースコードを見やすくした。 今この記事をみるとバカな事やっているな〜(爆)と思ってしまう。