首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strlen()编译时优化

strlen()编译时优化
EN

Stack Overflow用户
提问于 2016-04-04 03:13:17
回答 5查看 4K关注 0票数 7

几天前,我发现您可以使用以下代码找到编译时strlen

代码语言:javascript
复制
template<size_t N>
constexpr size_t strlen_(const char (&data)[N]) noexcept{
    return N - 1;
}

如果它被编译了,那么一切都是好的。可以添加重载,如下所示:

代码语言:javascript
复制
size_t strlen_(const char *s) noexcept{
    return strlen(s);
}

然后,它将始终编译。

我的问题是- C++ <cstring>是否使用了这样的东西,如果没有-为什么?

EN

回答 5

Stack Overflow用户

发布于 2016-04-04 03:29:06

不,它不会。因为它给出了错误的答案。

代码语言:javascript
复制
char x[10] = "abc";
int correct_length   = std::strlen(x);  // 3
int incorrect_length = strlen_(x);      // 9

此外,使用2重载时,模板将永远不会被调用。接受const char*的非模板类总是首选的。

这并不意味着不能在编译时使用一些编译器魔术来计算strlen。但是,使用适当的语言,不能这样做。

票数 9
EN

Stack Overflow用户

发布于 2016-04-04 04:02:25

您的strlen_返回数组data的大小,而不是以null结尾的字符串的大小。正确的实现应该是:

代码语言:javascript
复制
constexpr size_t ct_strlen( const char* s ) noexcept
{
  return *s ? 1 + ct_strlen(s + 1) : 0;
}
票数 5
EN

Stack Overflow用户

发布于 2016-04-04 03:27:36

你的代码是错误的。

令人惊讶的是,在strlen()上进行编译时优化的正确方法是调用strlen()。像clang这样的现代编译器在知道编译时的长度时,会优化掉不必要的strlen()

此外,在大多数情况下,当程序员将sizeof与保存文字字符串的变量一起正确使用时,它会派上用场。像这样:

代码语言:javascript
复制
const char foo[] = "Hello World";
size_t len = sizeof(foo)-1; // 11

请注意,这有一些假设,如果你这样做,你会给自己带来麻烦,但不会让你的生活变得简单:

代码语言:javascript
复制
const char foo[] = "Hello World\01234";
size_t len = sizeof(foo)-1; // 16

编辑:让明显的更多看起来像一个答案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36389936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档