强大sizeof

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值