加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 编译时“strlen()”有效吗?

发布时间:2020-12-16 05:34:21 所属栏目:百科 来源:网络整理
导读:有时需要将字符串的长度与常量进行比较. 例如: if ( line.length() 2 ){ // Do something...} 但是我试图避免在代码中使用“魔术”常量. 通常我使用这样的代码: if ( line.length() strlen("[]") ){ // Do something...} 由于函数调用,它更可读,但效率不高
有时需要将字符串的长度与常量进行比较.
例如:
if ( line.length() > 2 )
{
    // Do something...
}

但是我试图避免在代码中使用“魔术”常量.
通常我使用这样的代码:

if ( line.length() > strlen("[]") )
{
    // Do something...
}

由于函数调用,它更可读,但效率不高.
我写了模板函数如下:

template<size_t N>
size_t _lenof(const char (&)[N])
{
    return N - 1;
}

template<size_t N>
size_t _lenof(const wchar_t (&)[N])
{
    return N - 1;
}

// Using:
if ( line.length() > _lenof("[]") )
{
    // Do something...
}

在发布版本(VisualStudio 2008)中,它生成了相当不错的代码:

cmp    dword ptr [esp+27Ch],2 
jbe    011D7FA5

好的是,编译器不会在二进制输出中包含“[]”字符串.

它是编译器特定的优化还是常见的行为?

解决方法

内联函数调用的功能是编译器特定的优化和常见行为.也就是说,许多编译器可以做到这一点,但是它们不是必需的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读