今天心血来潮, 写了一个取整数高位和低位的模板, 在G++和VC下用优化编译, 代码在最后. 简单记录一下结论:
对于有符号整数:
i >> k ;
i &= mask ;
如果K和mask均为常量, 且mask高k位全零, 低位全1的时候 ,g++可优化为无符号右移操作, 类似其它语言里的>>>, VC不作此优化
对于volatile 变量:
g++严格不优化, 每次写/读都访问内存.
VC发现程序该变量在连续直接使用(中间不调用其它函数)且最后是写操作时候, 中间不再访问内存. 直接使用寄存器. 类似CPU流水线寄存器指令引退.
1 template <typename T>
2 class is_signed_type { public: static const bool value ; } ;
3
4 template <typename T>
5 const bool is_signed_type<T>::value = ( (static_cast<T>(-1) >> 1) == static_cast<T>(-1)) ;
6
7
8
9 template<int shift, typename T>
10 inline T int_low(T n) {
11 T mask = ~(static_cast<T>(-1) << shift) ;
12 return n & mask ;
13 }
14
15 template<int shift, typename T>
16 inline T int_high(T n) {
17 if (is_signed_type<T>::value) {
18 const int rshift = sizeof(T) * 8 - shift ;
19 T mask = ~(static_cast<T>(-1) << rshift) ;
20 n = n >> shift ;
21 n &= mask ;
22 return n ;
23 }
24 return n >> shift ;
25 }
26
27
28 int _tmain(int argc, _TCHAR* argv[])
29 {
30 __int32 volatile i ;
31 i = 0xFFFFF ;
32 i = int_high<15>(i) ;
33
34 i = 0xFFFFF ;
35 i = i >> 15 ;
36
37 printf ("%x/n", i) ;
38
39 return 0;
40 }
41