C++ 对处理器执行除法和模运算的最佳方法是什么?

C++ 对处理器执行除法和模运算的最佳方法是什么?,c++,c,division,modulo,processor,C++,C,Division,Modulo,Processor,如何同时执行除法和模运算。处理器有可能吗 比如: int a, b = 8 / 3; //a = 2, b = 2 或者是否有比以下更好的操作: int a = 8 / 3; int b = 8 % 3; 也许这样更好 int a = 8 / 3; int b = 8 - a * 3; 谢谢 也许这样更好 为什么会这样?对于程序员和编译/优化人员来说,这都是模糊的。在没有查看编译器输出的情况下,我会想象任何优秀的乐观主义者看到您的第一个代码并说“啊,一个div和一个mod正在执行,我最好发

如何同时执行除法和模运算。处理器有可能吗

比如:

int a, b = 8 / 3; //a = 2, b = 2
或者是否有比以下更好的操作:

int a = 8 / 3;
int b = 8 % 3;
也许这样更好

int a = 8 / 3;
int b = 8 - a * 3;
谢谢

也许这样更好

为什么会这样?对于程序员和编译/优化人员来说,这都是模糊的。在没有查看编译器输出的情况下,我会想象任何优秀的乐观主义者看到您的第一个代码并说“啊,一个div和一个mod正在执行,我最好发出
divmod
1操作码”。而在第二种情况下,乐观主义者完全有权耸耸肩,让它保持这种状态

作为一般规则(尽管有许多例外),直接声明语义的最干净的代码也是最容易优化的代码


1对于给定处理器,操作码名称可能不同

也许这样更好

为什么会这样?对于程序员和编译/优化人员来说,这都是模糊的。在没有查看编译器输出的情况下,我会想象任何优秀的乐观主义者看到您的第一个代码并说“啊,一个div和一个mod正在执行,我最好发出
divmod
1操作码”。而在第二种情况下,乐观主义者完全有权耸耸肩,让它保持这种状态

作为一般规则(尽管有许多例外),直接声明语义的最干净的代码也是最容易优化的代码



1对于给定的处理器,操作码名称可能不同。

考虑以下功能:

std::pair<int, int> divmod(int x, int y)
{
    return { x / y, x % y };
}

如您所见,它在第3行只包含一个分区。优化器在这方面非常擅长。

考虑以下功能:

std::pair<int, int> divmod(int x, int y)
{
    return { x / y, x % y };
}

如您所见,它在第3行只包含一个分区。优化器在这方面很在行。

也许您正在创建一个问题的解决方案,而
std::div
就是用来解决这个问题的

namespace std
{

struct div_t
{
    int quot;
    int rem;
};
struct ldiv_t
{
    long int quot;
    long int rem;
};
struct lldiv_t
{
    long long int quot;
    long long int rem;
};

  div_t div ( int numer, int denom );
 ldiv_t div ( long int numer, long int denom );
lldiv_t div ( long long int numer, long long int denom );

}; // namespace std

也许您正在创建一个问题的解决方案,而
std::div
是用来解决这个问题的

namespace std
{

struct div_t
{
    int quot;
    int rem;
};
struct ldiv_t
{
    long int quot;
    long int rem;
};
struct lldiv_t
{
    long long int quot;
    long long int rem;
};

  div_t div ( int numer, int denom );
 ldiv_t div ( long int numer, long int denom );
lldiv_t div ( long long int numer, long long int denom );

}; // namespace std

可能会引起兴趣。您的优化编译器应该比您更清楚,所以不必费心(我想这在实践中并不重要:缓存未命中的代价比除法高得多)。如果处理器有一条指令来完成这项工作,那么处理器是有可能的。有许多不同的处理器,都具有不同的功能。6502个甚至没有除法(或乘法,对于这一点)。@ MyBDNILO有6502个.casyasistykvytIc的C++编译器:我不确定所有编译器都可以应用这个技巧。对于计算密集型代码,尝试并避免划分确实很重要。可能有兴趣。您的优化编译器应该比您更了解,所以不必费心(我想在实践中也没那么重要:缓存未命中的代价比除法高得多)如果处理器有一条指令可以完成这项工作,那么处理器是有可能的。有许多不同的处理器,都具有不同的功能。6502个甚至没有除法(或乘法,对于这一点)。@ MyBDNILO有6502个.casyasistykvytIc的C++编译器:我不确定所有编译器都可以应用这个技巧。对于计算密集型代码,尝试避免除法非常重要。+1。最常见的优化器是窥视孔优化器,因为它们非常简单。这只是一组规则,形式为“如果您看到模式
XYZ
,则替换为指令序列
AB
”。特别是,有一组有限的公共模式
XYZ
<代码>a/b,a%b是一种常见模式,
a/b,a-(a/b)*b
不是。最常见的优化器是窥视孔优化器,因为它们非常简单。这只是一组规则,形式为“如果您看到模式
XYZ
,则替换为指令序列
AB
”。特别是,有一组有限的公共模式
XYZ
<代码>a/b,a%b是一种常见模式,
a/b,a-(a/b)*b
不是。很棒的东西!此外,编译器还将用
伟大的东西取代
%y
->
&(y-1)
/y
!此外,编译器还将用