转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3365

上一篇提到了把编译器要求升到了vc11/g++ 4.6/clang 3.4之后,develop分支又做出了一些改进。终于,我们完成了现阶段的C++11化改进。

constexpr

vc14开始支持constexpr,所以可以用它来实现编译期字符串hash。以后还会进一步增加constexpr的使用,改善执行性能。在KFL里定义了一个宏KLAYGE_CONSTEXPR,在支持的时候是constexpr,否则定义为空。

emplace,move

map里插入元素,原先的做法是insert(make_pair(key, value))。这么做代码比较长,在C++11里有了emplace,可以用emplace(key, value)来代替原来的写法。而且STL的实现里一般用了move semantic把key和value直接移入map,不用拷贝。如果原先已经有构造好了的pair,那么用insert和emplace是一样的。

另外,对于一些性能关键的地方,比如数学库里的Vector_T、Matrix_T之类,现在都添加了T(T&& rhs)和operator=(T&& rhs)。通过手动增加了这些移动函数,性能可以有2-5%的提升。

auto

上一篇提到了用decltype来简化循环的写法,但那样需要vc12的decltype v1.1。后来论坛里的hhyytt提醒我,可以用

for (auto& i : v)
{
    ...
}

这样的写法(有的时候是const &)。这样的话只要vc11,而且比decltype更简单。原先在vc10 beta上试图这么写,失败了,之后就在没实验过。现在终于可以了。

总结

在这个版本的要求里,改进成C++11就基本这样了。总的来说,代码比以前更短,更易懂,编译速度和运行性能更高。依赖于boost的部分比以前少得多了,所以boost的包从2.3MB缩小到了1.9MB。

按照计划,下一个版本会进一步增加C++11的使用,并尝试引入C++14的语法。g++也要要求带有thread,这样可以去掉多个boost库的依赖。