template <typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))
然后使用這個arraysize宏就可以在編譯時求出數(shù)組的大小
初看這段代碼,我表示很糾結(jié),發(fā)給同學(xué)討論了下,然后表示有點(diǎn)眉目了,其實(shí)這就是一個編譯時求數(shù)組大小的一個寫法,當(dāng)然我們也可以寫成
#define arraysize(array) (sizeof(array)/sizeof(array[0]))
這樣的格式,這種格式相信所有人都能看懂,我想其最所以不這么寫是因?yàn)榭紤]到效率問題吧,避免了上述寫法的除法運(yùn)算,除運(yùn)算則是在四則運(yùn)算里面最耗時的(傷不起的C++,效率高了,可讀性下降的不止一點(diǎn)兩點(diǎn)哈)
可以自己寫個小程序測試一下:
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數(shù)組類型換成int,char等結(jié)果依舊是200,這個比較好理解,因?yàn)椴捎胻emplate模板編程,泛型編程.......但是這種用法只能確定編譯時段尺寸確定好了的數(shù)組,若不然如果是采用動態(tài)數(shù)組,比如將代碼15行中的a換成b,則編譯失敗.......
其實(shí)大致流程是:T[N]的引用->char[N]的引用,最后就是sizeof(char[N]),char其實(shí)就是Byte,輸出也即N ^_^
某位朋友給的網(wǎng)址,將這個問題說的比較透徹,有興趣大家可以看看(同時關(guān)于誤刪了這位朋友的評論,表示歉意):http://blog.csdn.net/yuanmanzheng/article/details/5472967