1. 优点(相比于全局变量):
1.1 避免污染全局空间。
1.2 根本上避免了类被重复实例化。因为只能从唯一的接口得到类的instance。
1.3 允许更灵活的实现策略。
2 缺点:
2.1 构造函数没法传递参数。
2.2 销毁instance时,确定销毁顺序很困难。Instance在需要时创建,但没有信息指引不同类型Singleton instance之间的依赖关系。
2.3 不同厂商的编译器和硬件平台,有可能使用不同的优化措施,这导致Singleton模式在多线程环境下可能有严重的潜在问题,即使使用"Double-checked locking"等措施也不能完全避免。下边这篇文章针对Java,但大部分也适用于C++:
http://www.ibm.com/developerworks/java/library/j-dcl.html
Thursday, October 21, 2010
Monday, October 18, 2010
Type Container of Meta-programming
1. boost::tuple
本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。
tuple为元编程提供的工具有:
element <N, Tuple>::type
length < Tuple >::value
2. loki::Typelist
一种类型容器,为元编程提供的方法有:
Length
TypeAt
IndexOf
Append
Erase
Replace
为编译期到运行期提供映射的工具有:
GenScatterHierarchy
GenLinearHierarchy
3. boost::mpl::vector, list, etc.
专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:
begin<>, end<>, transform<>, insert<>...
为编译期到运行期提供的映射的工具有:
for_each<>
总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。
4. boost::fusion
boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。
5. lmp::tuple
自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element< N, lmp::tuple >将返回lmp::null_type,而不是像boost::element < N, boost::tuple >那样由编译器报一个编译错误。
lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。
本身不是为meta-programming而出现的,但是,tuple能包含任意个数据类型,并生成instance,成为融合编译时meta-programming和运行时programming的绝佳工具。
tuple为元编程提供的工具有:
element <N, Tuple>::type
length < Tuple >::value
2. loki::Typelist
一种类型容器,为元编程提供的方法有:
Length
<TypeList >TypeAt
<TypeList, N >IndexOf
<TypeList, T >Append
<TypeList, T >Erase
<TypeList, T >Replace
<TypeList, T, U >为编译期到运行期提供映射的工具有:
GenScatterHierarchy
GenLinearHierarchy
3. boost::mpl::vector, list, etc.
专为元编程提供的一套工具,在元编程领域实现了类似于STL container的语义。为元编程提供的方法有:
begin<>, end<>, transform<>, insert<>...
为编译期到运行期提供的映射的工具有:
for_each<>
总而言之,MPL库在编译期的元编程能力极其强大,但运行期的能力略显不足。
4. boost::fusion
boost::tuple 和 boost::mpl的结合体,为编译期和运行期的元编程提供支持。并大量使用view来提高编译性能。
5. lmp::tuple
自己使用的light-weight meta-programming toolkit. 与boost::tuple的最主要区别是:当N是一个无效值(比如-1)时,lmp::element
lmp::tuple的好处是允许高阶的元编程,比如缺省处理类型。
Subscribe to:
Posts (Atom)