class point{public: inline double &operator[] (int index) { assert(index >=0 && index <= 2); return location[index]; }};
“嗨,漂亮吧!”这个,我喜欢。”这个越界检查在release版本中没有任何性能开销。”
guru点点头。”并且,”她又说道,”使用一个优化能力很强的编译器时,能生成和直接访问成员同样高效的代码,而又兼具着封装及其安全性。”
“所以,”我思索着,”实在没有理由存在公有数据成员,是吧?”
guru在回答前停了一下。 “在绝大多数情况下,没有理由。然而,如果一个类仅仅是一个便利性的数据聚合体,而不是对象模型-也就是说,c风格的struct,只有数据而没有额外行为-那么将所有数据置为公有是合理的 [4]。”
“你可以通过访问函数和mutator函数将私有成员暴露出去-但只在它真的有必要时。多余的get和set函数-包括此处的operator []-表明你没有认真考虑封装。当测试表明访问函数真的存在运行期开销时,你可以通过将它们实现为inline来提高速度。当然,所得的提高因编译器而异-所以需要测试。”
“我明白了,老板,”我高兴地回答。她笑了,拢着手静静地走开了。我坐下来写好了测试代码。其结果,至少就我所使用的编译器而言,非常有趣[5] :
|
|
approximate run-time in milliseconds | ||
|
implementation |
optimizations off |
optimizations on |
|
|
1: direct access |
1061 |
251 |
|
|
2: inline accessor function |
1673
本文关键:Herb Sutter,http://www.gotw.ca,Guru,“Conversation”
| ||