- 论坛徽章:
- 44
|
本帖最后由 windoze 于 2015-10-29 13:40 编辑
回复 7# wlmqgzm
这正常,boost考虑兼容性,很多地方有一些hack或者妥协,STL是编译器自带的,只需要支持一个编译器,不需要考虑兼容性,自然可以多做一些优化。
一个典型的例子就是boost.variant,这个东西其实没有用变长模板,而是用传统的手段v<T1, <T2, <T3...>>>这么套起来的,但最里面的一对类型(必须得是一对,因为里面的模板定死了两个参数)就得有一个标记为结束,然后它就用了一个boost::detail::variant::void_。最终的结果是,你写泛型visitor的时候必须得处理这个类型,否则可能编译不过去
另外boost.variant由于要支持老编译器,没有使用move语义,所以多了很多copy操作,如果你大量的用它放string,“效果”更加明显。
我自己重新实现了一个variant,因为不用支持老编译器,所以可以做很多优化,比如不需要boost::detail::variant::void_这种东西,也完整支持move语义,综合性能肯定要比boost的那个快一点,当然兼容性也差一点……嗯……很多……不支持全系列VC…… |
|