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

Leo*_*all 4 c++ constexpr c++11

#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;
}
Run Code Online (Sandbox Code Playgroud)

嗨,我想在compile-time中得到一个字符串的长度.所以我写了上面的代码.但是在反汇编代码中,我发现下面名为sub_401000的'constLength'函数将导致计算字符串长度的运行时开销.有什么问题吗?(Visual Studio 2015 Preview,最大化速度(/ 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;
}
Run Code Online (Sandbox Code Playgroud)

Pot*_*ter 7

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

试试这个:

constexpr const char* p = "1234567";
Run Code Online (Sandbox Code Playgroud)

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

constexpr size_t i = constLength(p);
Run Code Online (Sandbox Code Playgroud)


Zha*_*ang 5

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

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