强大sizeof

    技术2022-05-11  127

    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};     };  //这是我的实现,书中的更通用。


    最新回复(0)