模板与继承之艺术——空基类优化
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;
}
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,转载请注明出处。
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,转载请注明出处。
相关文章推荐
- 模板与继承之艺术——奇特的递归模板模式(CRTP)
- 对模板、模板基类、派生类private继承、派生类public继承的一些认识
- 关于CodeSmith主模板与子模板同时从一个基类继承后的参数传值问题(提供模板下载)
- 模板与继承之艺术——命名模板参数
- 修改tt模板让ADO.NET C# POCO Entity Generator With WCF Support 生成的实体类继承自定义基类
- 数据编辑基类模板
- C++ 370-24题-2 继承基类
- peercast 代码分析(2)——构建一个lib,并继承其中的基类
- 通过可视化继承和页面模板控制站点设计
- [导入]C#继承类重写与隐藏基类方法的区别
- 通过可视化继承和页面模板控制站点设计 --作者:Fritz Onion
- 区分继承和模板
- peercast 代码分析(2)——构建一个lib,并继承其中的基类
- 学习C++模板---模板类作为基类,使用参数类
- 继承System.Web.UI.Page的页面基类
- C++中的多继承、虚继承和模板的来由
- C++ 内存布局(二) 虚继承 ---Empty virtual base classs (空虚基类)
- 11.22 模板同虚函数(继承)在实现接口(interface)上的异同
- 继承System.Web.UI.Page的页面基类
- 继承System.Web.UI.Page的页面基类