C++给变量赋值和通过方法赋值有性能上的区别吗

jyztefdp  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(159)

在编写类和使用方法设置变量值时,我主要使用私有变量。
特别是数组,索引它们只需要使用运算符[]。但是如果我把它们放在一个方法里,比如getIndex(int x),然后调用这个方法,会不会对性能有影响,比如说稍微慢一点?

0s7z1bwu

0s7z1bwu1#

这个问题可以成为一个更大的讨论的开始,以探索深层次的哲学问题。
首先,这听起来很像是过早的优化。我建议你首先考虑类和它的接口的设计,然后再考虑性能。大多数情况下,当涉及到像这样的低级优化时,编译器比你更聪明。
在你的例子中,你讨论的是获取值,而不是设置值,这很重要。你的数据成员通常应该是私有的,然后你需要考虑你的类应该有什么接口。根据你的类的使用方式,你可能需要一个getItem(int idx),它返回给定索引处的项,或者你可能需要一个getItems(),它返回整个项数组。
对于设置值,通常需要更加小心,因为您希望限制类的客户端对对象的干扰。您肯定不希望为每个数据成员都设置setter,因为这几乎与将数据成员设置为公共一样糟糕。
有些数据成员可能需要一起设置,因为您要验证涉及它们的某些条件。有些数据成员根本不应被类的用户修改。

gj3fmq9x

gj3fmq9x2#

这实际上取决于编译器是否可以内联对这些getter/setter的调用。
如果满足以下任一条件,则可以内联它们:

  • 每个翻译单元都可以访问它们的定义--实际上,如果它们在类的头文件中的话。要么内联到类定义中,要么inline--在它之后定义。
  • 启用链接时优化。

如果可能的话,任何启用了优化的优秀编译器都会内联简单的getter/setter,在这种情况下,程序集将完全相同。
但是你应该关心吗?不。首先写干净的代码。
除非您可以通过性能指标评测证明存在性能问题。在这种情况下,请启用LTO或将定义放在标头中。
另一方面,将成员私有化,并将访问隐藏在方法后面是非常好的抽象。如果您决定实现边界检查,请在代码库中重构所有object.array[idx]表达式。

相关问题