让编译器根据体系结构选择乘法算法
Let compiler select multiplication algorithm depending on architecture
《实时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位,这是这里唯一可观察到的含义)。
相关文章:
- C++选择排序算法中的逻辑错误
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- 对于这个问题,是否有更好的数据结构和算法选择
- 使用opencv在受控环境中进行视频跟踪的跟踪标记和跟踪算法选择
- 选择排序算法生成无序结果
- std::stable_sort: 如何选择内存优化算法而不是时间优化算法?
- 最小 kth 用于快速选择算法
- 我的Dijkstra算法没有选择短路径
- 我如何在C 中制作算法,以在不重复的情况下查找集合的变化(即n元素,选择k)
- 为什么我的中位数快速选择算法segfault
- 用于选择一组具有最高值总和的间隔的算法
- 快速选择算法因元素重复而失败
- 选择排序.如何进行选择作为稳定算法
- 如何利用遗传算法求C中数的平方根来实现选择和交叉
- 使用选择算法编译时递归排序
- 遗传算法的选择机制
- 顺序正向选择(SFS)算法
- 这是在包含非唯一元素的未排序数组中选择第k个最大数的最快算法
- 使用计数选择 (C++) 运行中位数算法