为什么一个空类的大小不为 0?


  
    要清楚,两个不同的对象的地址也是不同的。基于同样的理由,new总是返回指向不同对象的指针。 
看看: 
  
    class Empty { }; 
  
    void f() 
    { 
        Empty a, b; 
        if (&a == &b) cout << "impossible: report error to compiler supplier"; 
  
        Empty* p1 = new Empty; 
        Empty* p2 = new Empty; 
        if (p1 == p2) cout << "impossible: report error to compiler supplier"; 
    }    
  
有一条有趣的规则:一个空的基类并不一定有分隔字节。 

    struct X : Empty { 
        int a; 
        // ... 
    }; 
  
    void f(X* p) 
    { 
        void* p1 = p; 
        void* p2 = &p->a; 
        if (p1 == p2) cout << "nice: good optimizer"; 
    } 

这种优化是允许的,可以被广泛使用。它允许程序员使用空类以表现一些简单的概念。现在
有些编译器提供这种“空基类优化”(empty base class optimization)。

posted on 2007-03-24 09:41 阿刚 阅读(417) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(1)

随笔档案

文章档案

C++ BBS

C++ FAQ

C++ WEBSITE

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜