【发布时间】:2023-03-05 01:16:01
【问题描述】:
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中的错误?
【问题讨论】:
-
看起来像一个缺陷/缺少优化。 GCC 为这两个函数生成相同的代码。
-
请注意
char8_tis actually aunsigned char,但即使对第一个函数进行更改,编译器仍会优化代码,因此不可能是这样:godbolt.org/z/uUhMkW -
我怀疑这可能与 char8_t 是库提供的类型,编译器没有内在理解有关。
-
不完全相关,但仍然很有趣:将
-stdlib=libc++添加到 Godbolt 中的编译选项 具有 相同的编译器输出,但优化程度较低(看起来像 Godbolt默认使用libstdc++)。见here。所以显然标准库版本似乎也很重要 -
另请注意author's comment:“此实现是实验性的,将被删除或大幅修改以匹配通过 C++ 委员会的提案。”
标签: c++ clang compiler-optimization c++20