简单问题:
我非常喜欢封装的想法,但我真的不知道是否值得这是一个性能危急的情况。
例如:
x->var;
比
快x->getVar();
因为函数调用开销。有没有快速和封装的解决方案?
答案 0 :(得分:7)
答案 1 :(得分:5)
如果内联函数,则 无开销 。
另一方面,getters are a often code smell。而且一个糟糕的。他们坚持封装的字母,但违反了其原则。
答案 2 :(得分:2)
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)
正如其他人所指出的那样,开销可以忽略不计,甚至可以完全优化掉。 无论如何,瓶颈不太可能存在于这些功能中。如果您发现访问模式存在性能问题,那么如果您发现访问模式存在性能问题,那么如果您使用访问者功能,则可以轻松更新以获得更好的模式,例如:缓存。