在编写类和使用方法设置变量值时,我主要使用私有变量。特别是数组,索引它们只需要使用运算符[]。但是如果我把它们放在一个方法里,比如getIndex(int x),然后调用这个方法,会不会对性能有影响,比如说稍微慢一点?
getIndex(int x)
0s7z1bwu1#
这个问题可以成为一个更大的讨论的开始,以探索深层次的哲学问题。首先,这听起来很像是过早的优化。我建议你首先考虑类和它的接口的设计,然后再考虑性能。大多数情况下,当涉及到像这样的低级优化时,编译器比你更聪明。在你的例子中,你讨论的是获取值,而不是设置值,这很重要。你的数据成员通常应该是私有的,然后你需要考虑你的类应该有什么接口。根据你的类的使用方式,你可能需要一个getItem(int idx),它返回给定索引处的项,或者你可能需要一个getItems(),它返回整个项数组。对于设置值,通常需要更加小心,因为您希望限制类的客户端对对象的干扰。您肯定不希望为每个数据成员都设置setter,因为这几乎与将数据成员设置为公共一样糟糕。有些数据成员可能需要一起设置,因为您要验证涉及它们的某些条件。有些数据成员根本不应被类的用户修改。
getItem(int idx)
getItems()
gj3fmq9x2#
这实际上取决于编译器是否可以内联对这些getter/setter的调用。如果满足以下任一条件,则可以内联它们:
inline
如果可能的话,任何启用了优化的优秀编译器都会内联简单的getter/setter,在这种情况下,程序集将完全相同。但是你应该关心吗?不。首先写干净的代码。除非您可以通过性能指标评测证明存在性能问题。在这种情况下,请启用LTO或将定义放在标头中。另一方面,将成员私有化,并将访问隐藏在方法后面是非常好的抽象。如果您决定实现边界检查,请在代码库中重构所有object.array[idx]表达式。
object.array[idx]
2条答案
按热度按时间0s7z1bwu1#
这个问题可以成为一个更大的讨论的开始,以探索深层次的哲学问题。
首先,这听起来很像是过早的优化。我建议你首先考虑类和它的接口的设计,然后再考虑性能。大多数情况下,当涉及到像这样的低级优化时,编译器比你更聪明。
在你的例子中,你讨论的是获取值,而不是设置值,这很重要。你的数据成员通常应该是私有的,然后你需要考虑你的类应该有什么接口。根据你的类的使用方式,你可能需要一个
getItem(int idx)
,它返回给定索引处的项,或者你可能需要一个getItems()
,它返回整个项数组。对于设置值,通常需要更加小心,因为您希望限制类的客户端对对象的干扰。您肯定不希望为每个数据成员都设置setter,因为这几乎与将数据成员设置为公共一样糟糕。
有些数据成员可能需要一起设置,因为您要验证涉及它们的某些条件。有些数据成员根本不应被类的用户修改。
gj3fmq9x2#
这实际上取决于编译器是否可以内联对这些getter/setter的调用。
如果满足以下任一条件,则可以内联它们:
inline
--在它之后定义。如果可能的话,任何启用了优化的优秀编译器都会内联简单的getter/setter,在这种情况下,程序集将完全相同。
但是你应该关心吗?不。首先写干净的代码。
除非您可以通过性能指标评测证明存在性能问题。在这种情况下,请启用LTO或将定义放在标头中。
另一方面,将成员私有化,并将访问隐藏在方法后面是非常好的抽象。如果您决定实现边界检查,请在代码库中重构所有
object.array[idx]
表达式。