Bjarne:為什么一個空類的大小不為0

字號:

要清楚,兩個不同的對象的地址也是不同的?;谕瑯拥睦碛桑琻ew總是返回指向不同對象的指針。
    看看:
    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";
    }
    有一條有趣的規(guī)則:一個空的基類并不一定有分隔字節(jié)。
    struct X : Empty {
    int a;
    // ...
    };
    void f(X* p)
    {
    void* p1 = p;
    void* p2 = &p->a;
    if (p1 == p2) cout << "nice: good optimizer";
    }
    這種優(yōu)化是允許的,可以被廣泛使用。它允許程序員使用空類以表現(xiàn)一些簡單的概念?,F(xiàn)在有些編譯器提供這種“空基類優(yōu)化”(empty base class optimization)。