C++ 什么';使用它更好,为什么?
update()在主游戏循环中调用,因此在第二种情况下,我们会得到很多分配操作(unsigned int currentTimeMS)。在第一种情况下,我们只得到一个allocate并使用之前分配的变量。C++ 什么';使用它更好,为什么?,c++,refactoring,C++,Refactoring,update()在主游戏循环中调用,因此在第二种情况下,我们会得到很多分配操作(unsigned int currentTimeMS)。在第一种情况下,我们只得到一个allocate并使用之前分配的变量。 以下哪段代码更适合使用?为什么?在第一个示例中,您正在保存该类对象的状态。在第二个示例中,您不是,因此调用instant update()将丢失当前时间 这真的是由你来决定你需要哪一个 我推荐第二个变量,因为它是无状态的,并且变量的范围更小。只有当你真的遇到一个我认为不太可能的性能问题时,才使
以下哪段代码更适合使用?为什么?在第一个示例中,您正在保存该类对象的状态。在第二个示例中,您不是,因此调用instant update()将丢失当前时间
这真的是由你来决定你需要哪一个 我推荐第二个变量,因为它是无状态的,并且变量的范围更小。只有当你真的遇到一个我认为不太可能的性能问题时,才使用第一个。
如果你以后不修改变量值,你也应该考虑使它<代码> const <代码>,以便在代码中表达这个意图,并给编译器额外的优化选项。
第一种情况是定义一个成员变量,第二个是局部变量。基本类的东西。私有成员变量可用于该类中的任何函数(方法)。局部变量仅在声明它的函数中可用。它取决于您的需要。如果在update()
中只需要currentTimeMS
临时,那么一定要在那里声明它。(在您的情况下,#选项2)
但是如果类的实例需要它的值(即在其他方法中使用),那么您应该将它声明为字段(在您的示例中为#option1)
以下哪种代码更适合使用?为什么
首先,引用的代码充其量只是一个微小的微观优化。除非你不得不担心,否则不要担心这些事情
事实上,这很可能是一种失调。有时会在堆栈上分配自动变量。堆栈分配非常快(有时甚至是免费的)。没有必要担心。其他时候,编译器可能会在寄存器中放置一个小的自动变量,如此处使用的unsigned int
。没有任何分配
将其与使变量成为类的数据成员进行比较,并且仅为了避免这种分配。访问该变量需要通过这个指针。指针取消引用的代价可能远远超过向指针添加偏移量的代价。取消引用可能会导致缓存未命中。更糟糕的是,每次引用变量时都可能执行此解引用
也就是说,有时创建数据成员仅仅是为了避免在各种成员函数中出现自动变量,这样做会更好。声明为本地自动变量的大型数组很可能导致堆栈溢出。但是,请注意,将双大数组[2000][2000]
作为MyClass
的数据成员很可能使MyClass
类型的变量无法在某些函数中声明为局部自动变量
在堆栈上放置大型数组所产生的问题的标准解决方案是在堆上分配它们。这将导致另一种情况,即创建数据成员以避免局部变量可能是有益的。虽然堆栈分配非常快,但堆分配(例如,new
)非常慢。重复调用的成员函数可以通过使自动变量std::unique\u ptr big\u array=std::make_unique(2000*2000)
成为MyClass
的数据成员而受益
请注意,上述两项都不适用于问题中的示例代码。还要注意,最后一个问题(使堆分配的变量成为数据成员以避免重复分配和解除分配)意味着代码必须通过this
指针才能访问该内存。在紧凑的代码中,我有时被迫创建一个本地自动指针变量,如double*local\u pointer=this->some\u pointer\u member
,以避免重复遍历this
。您是否需要currentTimeMS
变量?无法直接调用gettimes
的地方?问题中没有足够的代码或内容来回答此问题。另外,在第一个代码片段中,您的标题是getTimeMS()
应该是getTimeMS代码>?您如何推荐?你不知道他对结果做了什么。它可能需要在其他地方使用。@afrogonabike:从他的代码示例中,我得出结论,该变量仅在update()
方法中使用。否则他不会有两种选择。是的,我想那是真的。未知的是OP是否缺乏对类声明的基本理解,或者问题是否更深入。OP?我同意你的第一句话,也许你的const,但是在C++中(我不知道关于java)没有理由相信第一个选项会更快(如果有不同的T,我期望相反)@可能有区别(不确定它是否重要):在第一个版本中,currentTimeMS
必须是内存中的实变量,可通过此
指针间接访问。在第二个版本中,它是一个局部变量,编译器可以更轻松地对其执行优化。在极端情况下,它可能永远不会被提交到内存中,而是完全保存在寄存器中。
class MyClass {
private:
unsigned int currentTimeMS;
public:
void update() {
currentTimeMS = getTimeMS();
// ...
}
};
class MyClass {
public:
void update() {
unsigned int currentTimeMS = getTimeMS();
// ...
}
};