封装v性能

时间:2010-11-09 08:59:49

标签: c++ performance encapsulation

简单问题:

我非常喜欢封装的想法,但我真的不知道是否值得这是一个性能危急的情况。

例如:

x->var;

x->getVar();

因为函数调用开销。有没有快速和封装的解决方案?

7 个答案:

答案 0 :(得分:7)

所有可能性都可以内联getVar()。即使存在性能损失,封装的好处远远超过性能考虑因素。

答案 1 :(得分:5)

如果内联函数,则 无开销

另一方面,getters are a often code smell。而且一个糟糕的。他们坚持封装的字母,但违反了其原则。

答案 2 :(得分:2)

  • “如果内联getVar函数没有开销”
  • “如果getVar()只是返回var;并且是内联和非虚拟的,那么两个表达式应该针对相同的事情进行优化”
  • “getVar()的所有可能性都可以内联”

Rafferty先生可以假设代码将被内联吗?不是“应该”或“可能”。在我看来,这是C ++的一个问题:它并不是特别的WYSIWYG:你不能确定它会产生什么代码。当然,使用oo有好处,但如果执行效率(性能)很重要,那么C ++(或C#或Java)并不是明显的选择。

关于另一个话题

有很多关于“过早优化”是所有邪恶的根源的讨论,因为没有人得到不成熟的东西,许多程序员认为优化是所有邪恶的根源。

在这些情况下,我发现提出原始报价是有帮助的,这样每个人都可以看到他们所遗漏的内容(更不用说误解和错误引用):

“我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。但我们不应该放弃我们在那个关键的3%中的机会。”

大多数人将引用归功于Tony Hoare(QuickSort之父)和一些Donald Knuth(计算机程序设计艺术)。

可以在此处找到关于引用可能或不可能含义的信息性讨论:http://ubiquity.acm.org/article.cfm?id=1513451

答案 3 :(得分:0)

您可以编写内联访问器功能。

答案 4 :(得分:0)

你是对的,因为在清洁面向对象设计和高性能之间经常需要权衡。但不要做出假设。如果您进行这些优化,则必须测试每个更改以获得性能提升。现代编译器在优化代码方面非常擅长(就像KennyTM对你的例子所说的那样),所以不要陷入Premature Optimization的陷阱。

答案 5 :(得分:0)

重要的是要意识到现代优化工具可以为您做很多事情,并且很好地使用C ++,您需要信任它们。他们会对此进行优化并提供相同的性能,除非您有意识地将访问者编码为脱机(具有不同的一组好处:例如,您可以修改实现并重新链接而无需重新编译客户端代码),或使用虚函数(但这是逻辑上类似于使用函数指针的C程序,并且具有类似的性能成本)。这是一个非常基本的问题:如果优化器无法正常工作,那么很多东西 - 比如迭代器,向量上的运算符[]等都会成本太高。所有主流的C ++编译器都已经足够成熟,可以在很多年前通过这个阶段。

答案 6 :(得分:0)

正如其他人所指出的那样,开销可以忽略不计,甚至可以完全优化掉。 无论如何,瓶颈不太可能存在于这些功能中。如果您发现访问模式存在性能问题,那么如果您发现访问模式存在性能问题,那么如果您使用访问者功能,则可以轻松更新以获得更好的模式,例如:缓存。