[英]Array Division - What is the best way to divide two numbers stored in an array?
[英]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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.