相关疑难解决方法(0)

在编译时计算C字符串的长度.这真的是一个constexpr吗?

我正在尝试在编译时计算字符串文字的长度.为此,我使用以下代码:

#include <cstdio>

int constexpr length(const char* str)
{
    return *str ? 1 + length(str + 1) : 0;
}

int main()
{
    printf("%d %d", length("abcd"), length("abcdefgh"));
}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,程序打印4和8.由clang生成的汇编代码显示结果在编译时计算:

0x100000f5e:  leaq   0x35(%rip), %rdi          ; "%d %d"
0x100000f65:  movl   $0x4, %esi
0x100000f6a:  movl   $0x8, %edx
0x100000f6f:  xorl   %eax, %eax
0x100000f71:  callq  0x100000f7a               ; symbol stub for: printf
Run Code Online (Sandbox Code Playgroud)

我的问题:标准是否保证length函数将在编译时进行评估?

如果这是真的,编译时字符串文字计算的大门刚刚为我打开...例如,我可以在编译时计算哈希值等等......

c++ standards string-literals constexpr c++11

86
推荐指数
6
解决办法
2万
查看次数

我可以依靠我的编译器来优化const char*上的strlen吗?

在我的SAX xml解析回调(XCode 4,LLVM)中,我正在对这种类型的代码进行大量调用:

static const char* kFoo = "Bar";

void SaxCallBack(char* sax_string,.....)
{
     if ( strcmp(sax_string, kFoo, strlen(kFoo) ) == 0)
     {

     }


  }
Run Code Online (Sandbox Code Playgroud)

假设strlen(kFoo)由编译器优化是否安全?

(Apple示例代码已经预先计算了strlen(kFoo),但我认为这对于大量常量字符串很容易出错.)

编辑:优化的动机:使用NSXMLParser在iPod touch 2G上解析我的SVG地图需要5秒钟(!).所以,我想切换到lib2xml,并优化字符串比较.

c compiler-construction optimization llvm strlen

15
推荐指数
2
解决办法
5819
查看次数