我遇到了一个奇怪的问题:我有以下代码:
int matches = 0;
for (int str_id = 0; str_id < STR_COUNT; str_id++) {
if (test(strings1[str_id], strings2[str_id]) == 0)
matches++;
}
test()
它使用该函数比较成对的以空字符结尾的字符串。strings1
并且是包含相同长度的以空字符结尾的字符串的strings2
向量。STR_COUNT
根据是否取消对其参数的引用,此代码段会根据andtest()
中字符串的长度以恒定时间或线性时间执行。也就是说,如果我使用:strings1
strings2
int test(char* a, char* b) {
return (a != b)
}
那么运行时间不取决于存储在strings1和strings2中的字符串的长度。另一方面,如果我使用
int test(char* a, char* b) {
return (*a != *b)
}
strings1
然后运行时间随着存储在和中的字符串的长度线性增加strings2
。
为什么会发生这种情况?
编辑:这里的问题的完整示例:http: //pastebin.com/QTPAkP1g