测试了一个简单的 utf8 strlen 函数,很惊讶trunk clang 完全消除了它(gcc 没有):
static int strlenutf8(const char* s)
{
int i = 0, l = 0;
while (s[i])
{
if ((s[i] & 0xc0) != 0x80) l++;
l++;
}
return j;
}
int main()
{
return strlenutf8("bla");
}
clang++ -O3 -S -fverbose-asm:
main: # @main
.cfi_startproc
# BB#0: # %entry
movl $3, %eax
ret
这就像 D 的编译时函数评估。这在 C++ 中是否合法?
我的意思是说,他们一开始就发明了那个糟糕的constexpr肯定是有原因的。据我所知,它甚至不能在这里使用,因为它受到严格限制。