我需要获取指向字符串的终止空字符的指针。
目前我正在使用这种简单的方法:MyString + strlen(MyString)
这可能是非常好的脱离上下文。
但是我对这个解决方案感到不舒服,因为我必须在字符串复制之后这样做:
char MyString[32];
char* EndOfString;
strcpy(MyString, "Foo");
EndOfString = MyString + strlen(MyString);
所以我在字符串周围循环了两次,第一次是 in 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");
但是,我担心我的实现可能比编译器提供的 CRT 函数慢(可能使用一些汇编优化或其他技巧,而不是简单的逐字符循环)。或者,也许我不知道一些标准的内置函数已经这样做了?
我做了一些穷人基准测试,迭代 0x1FFFFFFF 乘以三个算法(strcpy
+ strlen
,我的版本和user434507strcpylen
的版本)。结果是:
1) strcpy
+strlen
是赢家,只有 967 毫秒;
2)我的版本需要更多:57秒!
3) 编辑后的版本耗时 53 秒。
因此,在我的环境中使用两个 CRT 函数而不是自定义“优化”版本快 50 倍以上!