gpt4 book ai didi

c++ - 使用带有嵌套结构的模板化 lambda 时的类型推导 + 分析可能未使用的程序集输出

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:57 25 4
gpt4 key购买 nike

我有以下代码可以在 GCC (6.2)、Clang (3.9) 和 MSVC (2017RC) 上成功编译

template<typename T>    // (A)
auto asdf = [](T x) {
struct foo {
T xyz;
};

return foo{x};
};


int main() {
return asdf<float>(3.14).xyz; // (B)
}

关于上面的代码我有几个问题:

  1. 为什么在 GCC 5.4 上编译失败并出现以下错误: error: use of 'asdf<float>' before deduction of 'auto'在线 (A)
  2. GCC 和 MSVC(在一定程度上还有 Clang)生成的程序集基本上是 mov eax, 3; ret;然而 Clang 产生了一些额外的 guard ,检查的意义是什么以及何时可以/将检查:

clang 输出:

main: # @main
mov eax, 3
ret

cmp byte ptr [rip + guard variable for asdf<float>], 0
jne .LBB1_2
mov qword ptr [rip + guard variable for asdf<float>], 1
.LBB1_2:
ret

asdf<float>:
;empty
guard variable for asdf<float>:
;empty
  1. 最后,我知道 asdf 是一个变量模板,但是假设我使用的是 T 的依赖类型,那么 lambda 是否有任何方法可以在行 (B) 中自动推断出这种情况下的模板参数?

链接 godbolt.org

最佳答案

请注意,来自 clang 的额外 asm 在 RET 指令之后,并且在 RET 之前没有分支。因此,它不是前面函数的一部分。 clang 的 main()与 gcc 的 main() 相同

该事实的另一个线索是它之前的空白行。

真正发生的是 Godbolt Javascript 或服务器端的东西(不确定发生在何处)错误地删除了它不应该有的标签。点击 .LX0按钮禁用删除未使用的标签,你会看到(实际上不相关的标签被手动删除):

main:                                   # @main
mov eax, 3
ret

__cxx_global_var_init: # @__cxx_global_var_init
.Lfunc_begin1:
cmp byte ptr [rip + guard variable for asdf<float>], 0
jne .LBB1_2
mov qword ptr [rip + guard variable for asdf<float>], 1
.LBB1_2:
ret

虽然 guard 变量确实存在 :(

asdf<float>:
.zero 1
.size asdf<float>, 1

.type guard variable for asdf<float>,@object # @guard variable for asdf<float>
.section .bss._ZGV4asdfIfE,"aGw",@nobits,asdf<float>,comdat
.weak guard variable for asdf<float>
.p2align 3
guard variable for asdf<float>:
.quad 0 # 0x0
.size guard variable for asdf<float>, 8

看起来 Matt 的代码不小心过滤了 .zero .quad现在也有指令,因为 asdf<float>:标 checkout 现了,但它是 .zero 1没有。

我已经 opened an issue在 github 页面上获取为该站点提供支持的代码。 Matt Godbolt 看东西通常很快。 :)

无论如何,clang 有浪费的代码,但它只在启动时运行,并且在 .text.startup 中部分以及其他“冷”东西。

关于c++ - 使用带有嵌套结构的模板化 lambda 时的类型推导 + 分析可能未使用的程序集输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40709969/

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