当前位置:编程学习 > C/C++ >>

来自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 ",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 ^_^

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,