gpt4 book ai didi

c++ - SFINAE 组装?

转载 作者:IT老高 更新时间:2023-10-28 22:22:34 28 4
gpt4 key购买 nike

是否可以使用元编程技巧来允许在 assembly block 上使用 SFINAE?例如检测处理器上是否有类似“CPUID”的指令:(这不是有效的代码,但说明了我想要实现的目标)

// This should work if `CPUID` is a valid instruction on the target architecture
template <
class... T,
class = decltype(sizeof...(T), asm volatile("CPUID":::)
>
bool f(T...) {
return true;
}

// This should fail because `BLAH` is not an instruction
template <
class... T,
class = decltype(sizeof...(T), asm volatile("BLAH":::)
>
bool f(T...) {
return true;
}

最佳答案

由于下面列出的多种原因,不可能按照问题的表述方式实现问题的表述。然而,通过概括这个想法,它可能会成为一些有意义的东西,包括在未来的语言版本中。

它不起作用的原因:

  1. asm block 对 C++ 编译器是不透明的。此类 block 的语法是特定于编译器的。我不认为 MS VC++ 接受 GCC 和 Intel 编译器支持的clobber 列表。此外,微软的 x86_64 编译器停止支持汇编 block ,因为它们迫使人们使用内在函数。顺便说一句,也许依赖内在函数的存在可以用来提供编译时 CPU 调度?可能值得探索这个想法。

  2. asm block 是特定于目标架构的。还有其他方法可以在编译时检测目标架构。

  3. 存在/不存在指令的概念非常模糊。哪个实体有权对任何给定的 asm 表达式做出决定:将其文本转换为机器代码的汇编程序还是运行实际代码的目标处理器本身?两种选择都有问题。

    • 例如,“MOV”是多种架构的流行助记名称。但它在所有情况下都是相同的指令吗?与助记符绑定(bind)的语义不太可能在不相关的架构之间匹配。
    • 仅仅组装成功并不意味着它会执行良好。例如,在 Intel 64 架构上,一条指令即使是正确的,也可能出现 #UD(未定义指令信号)错误,因为它的行为取决于由操作系统控制的 CR0 和 CR4 寄存器的运行时值。在任何情况下,汇编程序都会很好地处理它。必须运行代码。但是,如果我们进行交叉编译,并且由于目标处理器与主机处理器不匹配而无法运行它怎么办?

事实上,如果不先执行不透明 block ,就无法知道它的结果。因此,编译器可能想要调用任意程序来返回一个值,然后该值将用于模板扩展。然后,这样的程序可以进行处理器或指令感应,并返回其发现以进一步指导编译。

现在这看起来足够抽象,可以成为一种语言特征,因为我们没有对这种外部程序的性质做出任何假设。仍然存在可移植性(+交叉编译)问题和安全性(运行外部程序有风险)问题。总而言之,在我看来,依赖从环境进入编译器的现有宏定义会更好。

关于c++ - SFINAE 组装?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48502085/

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