簡體   English   中英

對處理器執行除法和模的最佳方法是什么?

[英]What is the best way to perform a division and a modulo for the 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;

謝謝。

考慮以下功能:

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

使用g++ -std=c++11 -O1 -S編譯會產生以下匯編代碼:

movl    %edi, %eax
cltd
idivl   %esi
salq    $32, %rdx
movl    %eax, %eax
orq     %rdx, %rax
ret

如您所見,它僅在第3行包含一個除法。優化器在這方面非常擅長。

也許這更好?

為什么會這樣呢? 對於程序員和編譯器/優化器來說都是晦澀的。 在沒有查看編譯器輸出的情況下,我可以想象任何體面的優化器都能看到您的第一個代碼,並說:“啊,正在執行div和mod,我最好發出divmod 1操作碼”。 而在第二種情況下,優化器完全可以聳聳肩並留在那兒。

作為一般規則(盡管有很多例外),直接說明其語義的最干凈的代碼也是最容易優化的代碼。


1對於給定的處理器,操作碼名稱可能有所不同。

也許您正在為提供<cstdlib>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

http://www.cplusplus.com/reference/cstdlib/div/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM