这里,需要声明下,我是从MSDN的CRT分类开始的。因为CRT包括20来个子分类,很多都和系统关联太紧,所以我主要选择了几个分类(Buffer Manipulation,Data Conversion,String manipulation,Argument Access)来进行学习。
开始我们的学习吧!就先从Buffer Manipulation开始,Let‘s Go!
一、Buffer Manipulation
这个分类的各函数是以内存区内字节的形式进行处理的。我们会讨论到以下函数
函数 | 作用 |
_memccpy | 将一个缓冲区的字符复制到另一个给定字符之前或已复制指定数目的字符的目标内存区 |
memchr | 在一个内存区查找指定字符,返回指针指到所匹配的第一个目标缓冲区中的字符 |
memcmp | 比较指定的两个缓冲区中的字符数 |
memcpy | 将从一个缓冲区中的指定的数量的字符复制到另一个 |
memmove | 将从一个缓冲区中的指定的数量的字符复制到另一个,保证没有内存重叠 |
memset | 使用给定字符来初始化指定的缓冲区中的字节数 |
_swap | 交换字节的数据并将其存储在指定位置 |
1._memccpy
实现:
/****
copy bytes until character found
Purpose:
Copies bytes from src to dest until count bytes have been
copied, or up to and including the character _c, whichever
comes first.
Entry:
T *dest - pointer to memory to receive copy
T *src - source of bytes
T _c - character to stop copy at
unsigned int count - max number of bytes to copy
Exit:
returns pointer to byte immediately after _c in dest
returns NULL if _c was never found
Uses:
Exceptions:
****/
template<typename T>
inline T *tMemCCpy(T *pDest, T *pSrc, T _c, unsigned int uMaxCount)
{
while( uMaxCount && (*pDest++ = *pSrc++) != _c )
uMaxCount--;
return(uMaxCount ? pDest : NULL);
}
测试:
#ifdef _UNICODE
typedef wchar_t tChar;
typedef wchar_t* tPtrChar;
#else
typedef char tChar;
typedef char* tPtrChar;
#endif
tChar string1[60] = _T("The quick brown dog jumps over the lazy fox");
tChar buffer[61] = {0};
tChar *pdest = NULL;
int nStart = 0;
{
QPerformanceTimer last(nStart); // 对GetTicketCount的封装
for(DWORD i = 0; i < 10000; ++i)
{
pdest = (tChar *)CY_CRT::tMemCCpy( buffer, string1, _T('s'), 60 );
}
}
std::cout << nStart << std::endl;
*pdest = '/0';
std::wcout << buffer << std::endl;
相似函数:memcpy、strcpy、strncpy
后记:该函数M$是用汇编实现的,效率比我的实现高出太多了~就不贴比试结果了 ~-_-~