让编译器根据体系结构选择乘法算法

Let compiler select multiplication algorithm depending on architecture

本文关键字:算法 选择 体系结构 编译器      更新时间:2023-10-16

《实时C++》一书的第6.3章"了解算法的复杂性"包含以下列表:

std::uint16_t a = UINT16_C(55555);
std::uint16_t b = UINT16_C(61234);
void do_something()
{
    // Unsigned 16 x 16 --> 32-bit = 3,401,854,870.
    std::uint32_t result = a * static_cast<std::uint32_t>(b);
}

在本文中,作者指出,最好只将乘法运算的一个操作数强制转换为std::uint32_t,因为这样编译器可能会根据CPU架构(例如,8位或32位)"在16 x 16-->32位乘法和32 x 32-->32位相乘中的更好者之间进行选择,仍然可以得到正确的答案"。

我不明白如何允许编译器执行16 x 16-->32位乘法,因为操作数b显式转换为std::uint32_t。如果我正确理解整数提升/转换规则,操作数a将在乘法前提升为std::uint32_t,编译器只能执行32 x 32-->32位乘法。

我是不是遗漏了什么?

C++标准仅指定程序的可观察行为[intro.execution:1]:

相反,需要一致的实现来模拟(仅)抽象机器的可观察行为,如下所述。

由于您没有观察static_cast<std::uint32_t>(b)的结果,因此符合标准的编译器没有义务实际计算此子表达式。只需要执行乘法,就好像其中一个操作数是32位(因此结果不是16位,这是这里唯一可观察到的含义)。