gpt4 book ai didi

c++ - 是否有一个c++函数(内置或其他)可以在不重复操作的情况下给出整数除法和模除法结果?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:13 26 4
gpt4 key购买 nike

你可以这样写:

int i = 3;
int k = 2;
int division = i / k;
int remainder = i % k;

似乎认为这会在低层次上要求 ALU 执行两个视觉操作:一个返回商,一个返回余数。但是,我相信 ALU 很可能会在一次操作中同时计算这两者。如果是这样的话,这不是最有效的。

有没有更有效的方法,而不要求 CPU 计算两次?换句话说,是否可以通过 C++ 的单个操作来完成?

最佳答案

实际上,您编写的代码不会生成任何除法指令,因为编译器可以在编译时计算出结果。我写了一个小测试程序并设置编译器(VC++ 10SP1)生成一个汇编代码 list 。

#include <iostream>

using namespace std;

struct result {
long quotient, remainder;
};

result divide(long num, long den) {
result d = { num / den, num % den };
return d;
}

int main() {
result d = divide(3, 2);
d = divide(10, 3);
cout << d.quotient << " : " << d.remainder << endl;
return 0;
}

我不得不这样写,并明确告诉编译器不要内联任何函数。否则编译器会很高兴地优化掉大部分代码。下面是除法函数的汇编代码。

; 8    : result divide(long num, long den) {

00000 55 push ebp
00001 8b ec mov ebp, esp

; 9 : result d = { num / den, num % den };

00003 99 cdq
00004 f7 7d 08 idiv DWORD PTR _den$[ebp]

; 10 : return d;
; 11 : }

00007 5d pop ebp
00008 c3 ret 0

它足够聪明,可以生成单个 IDIV 指令并使用它生成的商和余数。现代 C 和 C++ 编译器非常擅长这种优化。除非您遇到性能问题并分析了您的代码以确定瓶颈在哪里,否则不要尝试猜测编译器。

关于c++ - 是否有一个c++函数(内置或其他)可以在不重复操作的情况下给出整数除法和模除法结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423900/

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