繁体   English   中英

c ++ 11通过constexpr在编译时获取字符串长度

[英]c++11 get string length in compile time by constexpr

#include <stdio.h>

constexpr size_t constLength(const char* str)
{
    return (*str == 0) ? 0 : constLength(str + 1) + 1;
}

int _tmain(int argc, _TCHAR* argv[])
{   
    const char* p = "1234567";
    size_t i = constLength(p);
    printf(p);
    printf("%d", i);
    return 0;
}

嗨,我想在编译时获取字符串的长度。所以我写了上面的代码。但是在反汇编代码中,我发现下面名为 sub_401000 的“constLength”函数将导致计算字符串长度的运行时开销.有什么问题吗?(Visual Studio 2015 预览版,以最大化速度(/O2)优化发布)

int __cdecl sub_401010()
{
    int v0; // esi@1

    v0 = sub_401000("234567") + 1;
    sub_401040(&unk_402130);
    sub_401040("%d");
     return 0;
}

int __thiscall sub_401000(void *this)
{
  int result; // eax@2

  if ( *(_BYTE *)this )
    result = sub_401000((char *)this + 1) + 1;
  else
    result = 0;
  return result;
}

constexpr函数只能在编译时使用编译时常量的参数调用时进行评估。 尽管p的值可以通过静态分析确定(它在初始化和评估之间不会改变),但它不是标准定义中的常量表达式。

尝试这个:

constexpr const char* p = "1234567";

此外,您可以通过将初始化变量声明为constexpr来保证在没有运行时开销的情况下初始化是可行的:

constexpr size_t i = constLength(p);

在 C++17 中,你可以使用std::char_traits::length

constexpr auto l = std::char_traits<char>::length("123");//string("123").length();
cout << l;

要在编译时强制求值,有几个技巧。 首先,您可以在枚举中使用该值。 但是,这会用“垃圾”枚举污染您的命名空间。

您还可以使用简单的模板在编译时强制评估。 请参阅static_eval.h 模板很小:

template<typename T, T V>
struct static_eval
{
    static constexpr T value = V;
};

然后,您可以将该模板与上面类似的代码一起使用: // size_t i = constLength(p); size_t i = static_eval::value;

这将强制编译时计算,或者如果表达式不计算为 constexpr 则强制编译时错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM