gpt4 book ai didi

c++ - clang 实现 char8_t 的方式是否存在缺陷,或者标准的某些暗角是否禁止优化?

转载 作者:IT老高 更新时间:2023-10-28 23:19:43 24 4
gpt4 key购买 nike

clang 8.0.0 引入了对来自 c++20 的 char8_t 类型的支持。但是,我希望以下函数具有相同的编译器输出

#include <algorithm>

bool compare4(char const* pcha, char const* pchB, int n) {
return std::equal(pcha, pcha+4, pchB);
}

bool compare4(char8_t const* pchA, char8_t const* pchB, int n) {
return std::equal(pchA, pchA+4, pchB);
}

但是,他们 compile -std=c++2a -O2 下到

compare4(char const*, char const*, int):   # @compare4(char const*, char const*, int)
mov eax, dword ptr [rdi]
cmp eax, dword ptr [rsi]
sete al
ret
_Z8compare4PKDuS0_i: # @_Z8compare4PKDuS0_i
mov al, byte ptr [rdi]
cmp al, byte ptr [rsi]
jne .LBB1_4
mov al, byte ptr [rdi + 1]
cmp al, byte ptr [rsi + 1]
jne .LBB1_4
mov al, byte ptr [rdi + 2]
cmp al, byte ptr [rsi + 2]
jne .LBB1_4
mov al, byte ptr [rdi + 3]
cmp al, byte ptr [rsi + 3]
sete al
ret
.LBB1_4:
xor eax, eax
ret

后者显然没有优化。这是有原因的(我在标准中找不到任何原因)还是这是clang中的错误?

最佳答案

  1. 在 libstdc++ 中,std::equal 在检测到参数是“简单的”时调用 __builtin_memcmp,否则它使用简单的 for 循环。这里的“简单”是指指向相同整数或指针类型的指针(或某些迭代器包装器)。(relevant source code)

    • 类型是否为整数类型由内部 __is_integer trait 检测,但 libstdc++ 8.2.0(godbolt.org 上使用的版本)没有专门针对 char8_t,因此后者不会被检测为整数类型。(relevant source code)
  2. Clang(使用此特定配置)在 for 循环情况下生成比在 __builtin_memcmp 情况下更详细的程序集。 (但前者在性能方面不一定优化得少。见Loop_unrolling。)

所以这种差异是有原因的,这不是 clang IMO 中的错误。

关于c++ - clang 实现 char8_t 的方式是否存在缺陷,或者标准的某些暗角是否禁止优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55710134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com