割り算
疑問点:割り算の高速化のためシフト演算子を使う意味はあるか?
結論:最近のコンパイラは賢いので割り算だからといってシフト演算子を使う意味はない。
割る数が2のべき乗でない場合 → 除算命令が生成される
source
void testFunc (unsigned long val)
{
unsigned long result = val / 5;
printf ("%ld\r\n", result);
}
assembly
0x080049CC 2105 MOVS r1,#0x05
0x080049CE FBB0F1F1 UDIV r1,r0,r1
0x080049D2 A001 ADR r0,{pc}+0x08 ; @0x080049D8
0x080049D4 F7FBBDA4 B.W __2printf (0x08000520)
割る数が2のべき乗である場合 → ビットシフト命令が生成される(コンパイラによる最適化)
source
void testFunc (unsigned long val)
{
unsigned long result = val / 8;
printf ("%ld\r\n", result);
}
assembly
0x080049CC 08C1 LSRS r1,r0,#3
0x080049CE A001 ADR r0,{pc}+0x08 ; @0x080049D4
0x080049D0 F7FBBDA6 B.W __2printf (0x08000520)
シフト演算子の場合 → もちろんビットシフト命令が生成される
source
void testFunc (unsigned long val)
{
unsigned long result = val >> 3;
printf ("%ld\r\n", result);
}
assembly
0x080049CC 08C1 LSRS r1,r0,#3
0x080049CE A001 ADR r0,{pc}+0x08 ; @0x080049D4
0x080049D0 F7FBBDA6 B.W __2printf (0x08000520)
Please log in to post comments.
