据说是来自chrome的代码里的一个模板
2011-07-15 20:27
253 查看
template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)
))
;
#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)
))
;
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
的引用->char
的引用,最后就是sizeof(char
),char其实就是Byte,输出也即N ^_^
某位朋友给的网址,将这个问题说的比较透彻,有兴趣大家可以看看(同时关于误删了这位朋友的评论,表示歉意):http://blog.csdn.net/yuanmanzheng/article/details/5472967
转自http://www.cppblog.com/longzxr/archive/2011/07/08/150453.html
char (&ArraySizeHelper(T (&array)
))
;
#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)
))
;
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
的引用->char
的引用,最后就是sizeof(char
),char其实就是Byte,输出也即N ^_^
某位朋友给的网址,将这个问题说的比较透彻,有兴趣大家可以看看(同时关于误删了这位朋友的评论,表示歉意):http://blog.csdn.net/yuanmanzheng/article/details/5472967
转自http://www.cppblog.com/longzxr/archive/2011/07/08/150453.html
相关文章推荐
- 关于模板编程的一个例子 来自深度探索c++对象模型
- 据说在每一个互联网公司里,都有一个扫地的老太太。很偶然地,当她经过一个程序员的身边,扫一眼屏幕上的代码,会低声提醒对方说:小心,栈溢出了。
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
- 来自一个博客里的竖向CSS圆角导航菜单代码
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
- js模板,我们可以在<script>片断中定义一个被JS调用的代码,但代码又不在页面上显示.
- 一个简单的ibatis.net架构(包含项目模板代码下载)
- 分享一个好用的 图片滚动模板代码
- 服务器端我们通过一个 Servlet 来处理来自客户端的请求,并对客户端作出响应。其核心处理代码
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
- 只有20行Javascript代码!手把手教你写一个页面模板引擎
- 自定义一个异常类模板代码实例
- 200行python代码实现一个类似django的简单模板引擎
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
- 一行代码实现一个简单的模板字符串替换
- 发布一个的Web日期选择控件及源码(其中的js代码来自于Microsoft CRM)
- WordPress代码和分析-页面模板是从哪里来的(这是一个可以让人奔溃的设计)
- 来自Channel9的消息:用非凡的代码去赢一个XBOX!!