您的位置:首页 > 其它

模板与继承之艺术——空基类优化

2014-11-20 21:48 274 查看
1、概念
C++中有“空”类的概念,这就意味着在运行期间其内部不好任何内存。
只包含类型的成员函数、非虚成员函数和静态数据成员的类为空类。
非静态的数据成员,虚函数和虚基类则在运行时期消耗存储空间。
2、空基类优化如下:
#include<iostream>
using namespace std;
class Empty{
typedef int Int;
};

class EmptyToo : public Empty
{};
class EmptyThree : public EmptyToo
{};
int main()
{
cout << "sizeof(Empty):" << sizeof(Empty) << endl;
cout << "sizeof(EmptyToo):" << sizeof(EmptyToo)<< endl;
cout << "sizeof(EmptyThree):" << sizeof(EmptyThree) << endl;
}

#include<iostream>
using namespace std;

template<typename Base, typename Member>
class BaseMemberPair : private Base{
private:
Member member;
public:
BaseMemberPair(Base const &b, Member const &m):Base(b), member(m){}
//通过first来访问基类数据
Base const&  first() const{ return (Base const&)*this; }
//提供给const对象调用
Base& first() { return (Base&)*this; }

//通过second()来访问成员变量
Member const& second() const { return this->member; }
Member& second() { return this->member; }
};

template <typename CustomClass>
class Optimizable {
private:
BaseMemberPair<CustomClass, void*> info_and_storage;
};

class Test{
};
int main()
{
cout << sizeof(Optimizable<Test>) << endl;
//结果为4
return 0;
}


View Code



5、警告:

针对下面的情况:
template<typename T1, typename T2>
class MyClass{
private:
T1 a;
T2 b;
};
//优化
template<typename T1, typename T2>
class MyClass : private T1, private T2{};

在不知道T1和T2是否为类型的情况下,最好不要盲目使用上面的优化方法,因为:
(1)此方法不适用于原生类型int等
(2)如果T1, 和T2的类型相同继承会出问题。
(3)增加基类会改变接口,因为多重继承,如果T1和T2都有共同的基类Base的话,那么MyClass中的数据成员,成员函数将会有二义性。所以此方法最好适应是之前提演示出的情况。

编辑整理:Claruarius,转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: