【发布时间】:2018-10-28 14:07:29
【问题描述】:
代码:
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
void f(const char* s) {
for (size_t i = 0; i < strlen(s); i++) {
printf("%c ", s[i]);
}
}
void g(const vector<int>& v) {
for (size_t i = 0; i < v.size(); i++) {
printf("%d ", v[i]);
}
}
编译链接:https://godbolt.org/z/PCi5yg
你会看到汇编代码:
- 在函数
f()中,strlen(s)每次都会被调用; - 但在函数
g()中,v.size()只被调用一次。
这是为什么呢?
参数为const,在内循环中没有改变参数。
【问题讨论】:
-
嗯,向量是
const,但strlen不知道const,s不是const。 -
可以在扫描C风格字符串的代码中使用
for (size_t i = 0; s[i] != '\0'; i++),避免使用strlen()。 -
请记住,
strlen必须访问字符串中的每个字符,直到找到终止的 nul 字符。如果 C-Style 字符串在循环内没有改变,这可能是非常低效的。std::vector可以将其大小存储在成员变量中,因此可以快速返回大小;与std::string类似。