我正在业余时间为C ++编写一个字符串类。我不仅仅使用std::string
这是一个很好的理由,但这并不是我的意思,当我说std::string
不是答案时,相信我。
在我的标题字符串类(UString)中,我有:
inline size_t Length()
{
return strlen(rawString);
}
当我描述这个时,我得到:
String size retrieval times
CString: 53
UString: 605
std::string: 71
我为函数调用计时的代码是:
timespec ts;
timespec ts2;
const char* s1 = "Hello World";
UString s2 = "Hello World";
std::string s3 = "Hello World";
std::cout << "String size retrieval times" << std::endl << std::endl;
std::cout << "CString: \t";
clock_gettime(CLOCK_REALTIME, &ts);
strlen(s1);
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
std::cout << "UString: \t";
clock_gettime(CLOCK_REALTIME, &ts);
s1.Length();
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
std::cout << "std::string: \t";
clock_gettime(CLOCK_REALTIME, &ts);
s3.size();
clock_gettime(CLOCK_REALTIME, &ts2);
std::cout << ts2.tv_nsec - ts.tv_nsec << std::endl;
当我将长度方法更改为:
inline size_t Length()
{
strlen(rawString);
return 0;
}
我明白了:
String size retrieval times
CString: 57
UString: 80
std::string: 88
我使用的是G ++ 4.9.2的Ubuntu 12.04 64位
我正在使用g++ -std=c++11 ustringtest.cpp -o stringtest -lrt
有什么想法吗?我很困惑。我的猜测是它与返回类型有关,而且当我不是故意的时候我会隐式地投下一些东西,但我很确定`st
答案 0 :(得分:4)
如果编译器可以确定仅以某种方式使用strlen
之类的函数的结果,则它可以替换其他代码,这些代码足以满足此类目的。例如,如果代码要说
if (strlen(p) >= 2) ...
编译器可以合法地替换
if (p[0] && p[1]) ...
因为在与原件完全相同的情况下会是如此。同样,如果一个函数说...
return strlen("fred12345");
编译器可以合法地替换
return 9;
如果函数说
return strlen(p);
然而,除非编译器可以推断p
可能指向的内容或结果可能做什么,否则它必须调用从p
开始搜索字符的代码,直到找到零为止字节。