几天前我发现你可以strlen使用这样的东西找到编译时间:
template<size_t N>
constexpr size_t strlen_(const char (&data)[N]) noexcept{
return N - 1;
}
Run Code Online (Sandbox Code Playgroud)
如果它被编译,那么一切都很好.你可以添加这样的重载:
size_t strlen_(const char *s) noexcept{
return strlen(s);
}
Run Code Online (Sandbox Code Playgroud)
然后它将始终编译.
我的问题是 - C++是否<cstring>使用了这样的东西,如果没有 - 为什么?
当我有以下代码时
int main(void) {
printf("%zd\n", strlen("Hello World!"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并用 编译它-O3,strings将显示字符串“Hello World!” 二进制文件中缺少它,因为它在编译时进行了评估。
如果我改为使用我自己的函数
static inline size_t my_strlen(const char *s) {
const char *tmp = s;
while (*++tmp);
return tmp - s;
}
int main(void) {
printf("%zd\n", my_strlen("Hello World!"));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用相同的选项,仍然可以在二进制文件中找到该字符串。
为什么是这样?