据说是来自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

posted on 2011-07-08 12:08 蜗牛也Coding 阅读(2642) 评论(13)  编辑 收藏 引用

评论

# re: 据说是来自chrome的代码里的一个模板[未登录] 2011-07-08 13:04 a

If you use arraysize on a pointer by mistake, you will get a compile-time error.  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板[未登录] 2011-07-08 13:14 heroboy

根本不是效率原因。使用宏不能区分是数组还是指针。模板的话,如果传入的是指针会编译错误的。  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-07-08 18:05 nieyanbing

根本不是效率原因。使用宏不能区分是数组还是指针。模板的话,如果传入的是指针会编译错误的。
up  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-07-08 19:37 right

如楼上所说,是为了防止误用,效率没有任何差别,要知道,经编译器优化后都是常数  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板[未登录] 2011-07-08 20:54 杨粼波

这个模板,是在编译时做了一个类型检查,可以看做是一个断言:传入的参数必须是数组,否则编译不过。  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-07-09 16:13 蜗牛也Coding

额,看来我理解有误,呵呵@heroboy
  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-07-09 16:14 蜗牛也Coding

@right
额,,理解不够,,受教了
  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-07-09 16:14 蜗牛也Coding

@杨粼波
确实如此
  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-07-09 16:16 蜗牛也Coding

不好意思,不小心点错以至于误删了某位朋友的评论,你留的网址信息很有用,3ku ^_^  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-07-09 16:17 蜗牛也Coding

@a
you are right.....  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-08-12 13:58 Rockroad

agree with last  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-08-12 14:06 Rockroad

蜗牛也Coding 中的 Coding 什么意思?

nut 比较好吧 如果按字面意思。  回复  更多评论   

# re: 据说是来自chrome的代码里的一个模板 2011-08-20 23:21 蜗牛也Coding

@Rockroad
呵呵,,,coding == code + ing  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(8)

随笔档案(78)

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜