我的 C++ 项目中有一个粒子系统引擎,粒子本身只是没有函数的变量结构。目前,每个粒子 (Particle) 通过直接访问其变量从其父类 (ParticleSystem) 更新。例如
particle.x += particle.vx;
然而,我正在辩论使用这样的 getter 和 setter:
particle.setX( particle.getX()+particle.getVX() );
我的问题是: 调用 getter 和 setter 是否有任何性能开销,而不是直接访问数据?
毕竟,我确实有很多粒子要更新…
原文由 sgtHale 发布,翻译遵循 CC BY-SA 4.0 许可协议
Setter 和 getter 在未优化时会产生性能开销。 它们几乎总是在进行链接时间优化的编译器上进行优化。而在没有的编译器上,如果他们了解函数体(即不仅仅是原型),它将被优化掉。只需查找 内联优化。
但是,您使用 getter 和 setter 是因为您可能希望获取或设置该变量以产生额外的副作用。就像改变物体的位置一样,也会改变附近物体在物理模拟等中的位置。
最后,在优化代码的上下文中,getter 和 setter 操作的开销非常小,除非代码很热,否则不值得担心。如果它很热,只需将 getter 或 setter 移动到头文件并内联它就很容易了。
然而,在长期运行的科学模拟中,它可以加起来——但它需要数百万次调用。
总而言之,getter 和 setter 非常值得少量或不存在的开销,因为它允许您非常具体地指定对象可以和不可以发生的事情,并且还允许您编组任何更改。