当我从方法返回结果时,为什么strlen会变慢?

时间:2015-07-06 23:03:51

标签: c++ string strlen

我正在业余时间为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

1 个答案:

答案 0 :(得分:4)

如果编译器可以确定仅以某种方式使用strlen之类的函数的结果,则它可以替换其他代码,这些代码足以满足此类目的。例如,如果代码要说

if (strlen(p) >= 2) ...

编译器可以合法地替换

if (p[0] && p[1]) ...

因为在与原件完全相同的情况下会是如此。同样,如果一个函数说...

return strlen("fred12345");

编译器可以合法地替换

return 9;

如果函数说

return strlen(p);

然而,除非编译器可以推断p可能指向的内容或结果可能做什么,否则它必须调用从p开始搜索字符的代码,直到找到零为止字节。