sizeof 对于学过 c的来说很熟悉了。 c中经常这样用: sizeof(int); sizeof(struct MyS); char str[]="goodbye!"; sizeof(str); sizeof("string "); ...
sizeof在C++中发生一个变化 就是可以对 函数进行求解。 int f(void); sizeof(f); sizeof实质就是通过求解类型,最后获得内存大小的 编译时函数。
sizeof(8);//其实就是 sizeof(int)最后就是 int的内存大小(以char为基准) 那个sizeof(f);也是通过确定f的原型来确定返回值,再来求解内存大小。
求解类型对于 对象就是它的声明类型,对于函数就是它原型的返回值类型。
在C++中因为函数可以重载,所以在求解函数原型是会引起函数重载解析过程。 函数重载会引发一系列的微妙的操作。比如 template类的实例话,到public基类指针(或引用)的装换。 再加上替换失败不是错误的配合,sizeof可以用在很多有用的情景。 模板研读 一书的 判断 Class 类型的 模板:template<typename T>class IsClass{private: typedef char One; typedef struct{ char l[2];} Two ; template<typename U> static Two test(...); template<typename U> static One test(int (U::*));public: enum{Yes=sizeof(test<T>(0))==1}; enum{No=!Yes}; }; sizeof不会去决议表达式,它只是利用表达式去求解,得到答案后会丢弃表达式。 所以上面的test只要声明就可以了。
Modern C++ Design中也讲到个: 判断继承关系。 template<typename U,typename T> class SuperSubClass { private: typedef char One; typedef struct{ char l[2];} Two ; template<typename C> static Two test(...); template<typename C> static One test(C*); public: enum{Yes=sizeof(test<U>((T*)0))==1}; enum{No=!Yes}; }; //这是我的实现,书中的更通用。