lor*_*ova 4 c string performance crt
我需要获取指向字符串的终止空字符的指针.
目前我正在使用这种简单的方式:MyString + strlen(MyString)这可能是非常好的脱离上下文.
但是我对这个解决方案感到不舒服,因为我必须在字符串复制之后这样做:
char MyString[32];
char* EndOfString;
strcpy(MyString, "Foo");
EndOfString = MyString + strlen(MyString);
Run Code Online (Sandbox Code Playgroud)
所以我在字符串周围循环两次,第一次进入strcpy,第二次进入strlen.
我想通过返回复制字符数的自定义函数来避免这种开销:
size_t strcpylen(char *strDestination, const char *strSource)
{
size_t len = 0;
while( *strDestination++ = *strSource++ )
len++;
return len;
}
EndOfString = MyString + strcpylen(MyString, "Foobar");
Run Code Online (Sandbox Code Playgroud)
但是,我担心我的实现可能比编译器提供的CRT函数慢(可能使用一些程序集优化或其他技巧而不是简单的char-by-char循环).或者我可能不知道一些标准的内置功能已经做到了吗?
我做了一些可怜的男人标杆,迭代0x1FFFFFFF倍三种算法(strcpy+ strlen,我的版本strcpylen,以及版本的user434507).结果是:
1)strcpy+ strlen是胜利者,只有967毫秒;
2)我的版本需要更多:57秒!
3)编辑版需要53秒.
因此,在我的环境中使用两个CRT功能而不是自定义"优化"版本的速度要快50倍!
size_t strcpylen(char *strDestination, const char *strSource)
{
char* dest = strDestination;
while( *dest++ = *strSource++ );
return dest - strDestination;
}
Run Code Online (Sandbox Code Playgroud)
这几乎就是strcpy的CRT版本所做的,除了CRT版本也会做一些检查,例如确保两个参数都是非null.
编辑:我正在查看VC++ 2005的CRT源代码.pmg是正确的,没有检查.strcpy有两个版本.一个用汇编语言编写,另一个用C语言编写.这是C版本:
char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
; /* Copy src over dst */
return( dst );
}
Run Code Online (Sandbox Code Playgroud)
Hacker's Delight有一个很好的部分,可以找到C字符串中的第一个空字节(参见第6章第1节).我在Google Books中找到了(部分)它,代码似乎就在这里.我总是回到这本书.希望它有用.