公共变量是否比使用getter和setter更快?

Rai*_*ers 4 c++ optimization performance

我正在为我正在制作的游戏编写一个自定义物理引擎,我的物理对象类有很多变量(距离,速度,加速度,质量,重力,力,脉冲持续时间等......).为每个变量创建一个setter和getter函数会影响性能吗?(在给定时间内将至少有100个此类的实例)

我也应该创建setter和getter吗?我听说公共变量真的很糟糕,但是有很多变量,这可能是个例外吗?

πάν*_*ῥεῖ 7

为每个变量创建一个setter和getter函数会影响性能吗?

对于简单的getter/setter函数,它们通常可以由编译器内联,因此不会对性能产生影响.

我也应该创建setter和getter吗?我听说公共变量真的很糟糕

公共变量本身并不是一种不好的做法,尽管通常您希望将数据封装在一个类中,特别是如果在它们上应用了计算.

仅提供getter/setter函数的类是无用的,这些类通常可以简单地替换为struct包含所有公共变量的类.

  • 在调试时,只提供getter/setter函数的类可能有些用处:您可以在访问器函数上设置断点,以帮助跟踪值的神秘变化来自何处. (4认同)
  • 仅提供访问器方法的类可以演变为不超过该类的类,而不会破坏进程中的任何内容.简单的结构不能. (3认同)
  • @PeteBecker如果您需要,您的系统设计可能还有其他问题. (3认同)
  • @VishnuShankar如果您的值被其他类修改,它们将被封装**.将数据成员包装在getter/setter中并不会改变它 (3认同)

utn*_*tim 5

为每个变量创建一个setter和getter函数会影响性能吗?(在给定时间内将至少有100个此类的实例)

可能没有.理论上是的,但实际上,调用额外函数来获得特定值的成本可以忽略不计.它会影响性能的唯一方法是,如果你最终调用这些方法所有的时间(比方说......每秒50000次).

我也应该创建setter和getter吗?

可能没有.良好的OO设计遵循一个名为"告诉,不要问"的指导方针.通常你应该看看你需要这些变量的操作,然后在类中实现这些操作,或者在具有访问权限的类中实现它们,或者使用不同的模型(访问者模式会想到).

我听说公共变量真的很糟糕,但是有很多变量,这可能是个例外吗?

拥有公共变量并不是不好的做法.当你有不变量时有公共变量是不好的做法.

例如,如果您有一个测量对象重量的变量,您将需要确保无法将其设置为无效值(例如负数或非常大的数量).如果将变量设置为public,则必须检查在修改它的客户端代码中设置的值,或者放弃验证该值.

两者都很糟糕,因为如果你有一个propper setter并且有验证,它们就是不存在的错误.

简而言之,只有在没有变量的情况下才能使用公共变量.

注意事项:

  • 使用公共变量,如果设置变量类型允许的任何值都可以,在任何时候(你没有不变量)

  • 如果你有不变量,请使用私有变量.

  • 使用公共方法来定义操作,而不是"访问内部变量".

  • 根据您在客户端代码中查看时要执行操作来设计公共API ,而不是根据内部实现中存在变量.

在这种情况下,getter和setter在某些时候(很少)是有意义的,但不是因为你在类中有变量.

  • getter和setter是尝试在错误的地方解决问题的一种症状:如果你在A类中有一个使用B类变量的操作X,那么你应该在B类中定义操作X,然后从A类调用它.