Closed. This question needs details or clarity。它当前不接受答案。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
5年前关闭。
Improve this question
有关:
Is this treatment of int64_t a GCC AND Clang bug?
我能想到的唯一解决方案是将其中一个操作数显式转换为
但是,如果这样做,则取决于编译器的实际执行
如相关问题中所述,将
任何想法?
您的问题似乎是关于一种具有与功能签名相对应的汇编指令的假设体系结构
在这种假设的架构上,它们中的第一个具有相关的优点,此外,您的编译器在编译上述函数时无法使用此指令,最重要的是,它无法提供对上述内在函数的访问。
我希望这种情况真的很少见,但是如果您真的遇到这种情况,大多数编译器还允许您编写内联汇编,因此您可以编写直接调用此特殊指令的函数,并且仍然提供足够的元数据,因此优化器可以对其进行某种有效的使用(例如,使用符号输入和输出寄存器,以便优化器可以使用所需的任何寄存器,而不必对寄存器选择进行硬编码)。
想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。
5年前关闭。
Improve this question
有关:
Is this treatment of int64_t a GCC AND Clang bug?
我能想到的唯一解决方案是将其中一个操作数显式转换为
int64
,迫使乘积至少也为int64
。但是,如果这样做,则取决于编译器的实际执行
int64*int32
或int64*int64
的能力,或者理想情况下将其优化回int32*int32
。如相关问题中所述,将
int32*int32
的结果分配给int64
不会改变int32*int32
已经导致UB的事实。任何想法?
最佳答案
您已经说明了如何以标准,可移植且有效的方式执行此操作:
int64_t mul(int32_t x, int32_t y) {
return (int64_t)x * y;
// or static_cast<int64_t>(x) * y if you prefer not to use C-style casts
// or static_cast<int64_t>(x) * static_cast<int64_t>(y) if you don't want
// the integral promotion to remain implicit
}
您的问题似乎是关于一种具有与功能签名相对应的汇编指令的假设体系结构
int64_t intrinsic_mul(int32_t x, int32_t y);
int64_t intrinsic_mul(int64_t x, int64_t y);
int64_t intrinsic_mul(int64_t x, int32_t y); // and maybe this too
在这种假设的架构上,它们中的第一个具有相关的优点,此外,您的编译器在编译上述函数时无法使用此指令,最重要的是,它无法提供对上述内在函数的访问。
我希望这种情况真的很少见,但是如果您真的遇到这种情况,大多数编译器还允许您编写内联汇编,因此您可以编写直接调用此特殊指令的函数,并且仍然提供足够的元数据,因此优化器可以对其进行某种有效的使用(例如,使用符号输入和输出寄存器,以便优化器可以使用所需的任何寄存器,而不必对寄存器选择进行硬编码)。
关于c++ - 如何以标准/便携式和高效的方式编写int64 = int32 * int32? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29579112/
10-15 06:10