据说是来自chrome的代码里的一个模板

template  < typename T, size_t N >  
char  ( & ArraySizeHelper(T ( & array)[N]))[N]; 
#define  arraysize(array) (sizeof(ArraySizeHelper(array))) 
然后使用这个arraysize宏就可以在编译时求出数组的大小

 

初看这段代码,我表示很纠结,发给同学讨论了下,然后表示有点眉目了,其实这就是一个编译时求数组大小的一个写法,当然我们也可以写成

#define  arraysize(array) (sizeof(array)/sizeof(array[0])) 
这样的格式,这种格式相信所有人都能看懂,我想其最所以不这么写是因为考虑到效率问题吧,避免了上述写法的除法运算,除运算则是在四则运算里面最耗时的(伤不起的C++,效率高了,可读性下降的不止一点两点哈)
可以自己写个小程序测试一下:
 1  #include  " stdafx.h "
 2  #include  < stdio.h >
 3  #include  < stdlib.h >
 4 
 5  template  < typename T, size_t N >  
 6  char  ( & ArraySizeHelper(T ( & array)[N]))[N]; 
 7  #define  arraysize(array) (sizeof(ArraySizeHelper(array))) 
 8 
 9  int  _tmain( int  argc, _TCHAR *  argv[])
10  {
11 
12       double  a[ 200 ];
13 
14       double *  b  =   new   double  [ 100 ];
15       int  cnt  =  arraysize(a);
16      printf( " %d\n " ,cnt);
17 
18      system( " pause " );
19 
20       return   0 ;
21  }
输出是200,将a数组类型换成int,char等结果依旧是200,这个比较好理解,因为采用template模板编程,泛型编程.......但是这种用法只能确定编译时段尺寸确定好了的数组,若不然如果是采用动态数组,比如将代码15行中的a换成b,则编译失败.......
其实大致流程是:T[N]的引用->char[N]的引用,最后就是sizeof(char[N]),char其实就是Byte,输出也即N ^_^

 
某位朋友给的网址,将这个问题说的比较透彻,有兴趣大家可以看看(同时关于误删了这位朋友的评论,表示歉意):http://blog.csdn.net/yuanmanzheng/article/details/5472967

http://www.cppblog.com/longzxr/archive/2011/07/08/150453.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值