为什么当我 return 方法的结果时 strlen 变慢?

Why is strlen slower when I return its results from a method?

我在业余时间为C++写一个字符串class。我不只是使用 std::string 是有充分理由的,但这不是本文的目的,当我说 std::string 不是这里的答案时请相信我。

在我的 header 只有字符串 class (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;

当我将 Length 方法更改为:

inline size_t Length()
{
  strlen(rawString);
  return 0;
}

我得到:

String size retrieval times

CString:        57
UString:        80
std::string:    88

我在 Ubuntu 12.04 64 位 G++ 4.9.2 我正在编译 g++ -std=c++11 ustringtest.cpp -o stringtest -lrt

有什么想法吗?我很困惑。我的猜测是它与 return 类型有关,当我不是故意的时候我隐式地转换了一些东西,但我很确定 `st

如果编译器可以确定像 strlen 这样的函数的结果将仅以特定方式使用,它可能会替换其他足以满足此类目的的代码。例如,如果代码是

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

编译器可以合法地替换

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

因为它在与原始情况完全相同的情况下都是正确的。同样,如果一个函数说...

return strlen("fred12345");

编译器可以合法地替换

return 9;

如果一个函数说

return strlen(p);

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