什么更好用,为什么?
What's better to use and why?
class MyClass {
private:
unsigned int currentTimeMS;
public:
void update() {
currentTimeMS = getTimeMS();
// ...
}
};
class MyClass {
public:
void update() {
unsigned int currentTimeMS = getTimeMS();
// ...
}
};
update() 在主游戏循环中调用,因此在第二种情况下我们会进行大量分配操作(unsigned int currentTimeMS)。在第一种情况下,我们只获得一个分配并使用之前分配的变量。
这段代码中哪一个更好用?为什么?
在第一个示例中,您正在保存此 class 对象的状态。在第二个中,你不是,所以 currentTime 会在调用即时 update() 时丢失。
真正由您决定需要哪一个。
我推荐第二种,因为它是无状态的,而且变量的范围更小。仅当您确实遇到性能问题时才使用第一个,我认为这不太可能。
如果您以后不修改变量值,您还应该考虑将其设为const
,以便在您的代码中表达此意图并为编译器提供额外的优化选项。
第一种情况是定义成员变量,第二种情况是局部变量。基本 class 东西。 class 中的任何函数(方法)都可以使用私有成员变量。局部变量仅在声明它的函数中可用。
这取决于您的需求。如果 currentTimeMS
在 update()
中 暂时 需要,那么一定要在那里声明它。 (在你的情况下,#option2)
但是 如果 class 的实例需要它的值(即在其他方法中使用),那么您应该将其声明为一个字段(在你的情况下,#option1).
Which of this code better to use and why?
首先,引用的代码充其量只是一个微小的微优化。除非万不得已,否则不要担心这些事情。
事实上,这很可能是一种不优化。有时自动变量分配在堆栈上。堆栈分配非常快(有时甚至是免费的)。不用担心。其他时候,编译器可能会在寄存器中放置一个小的自动变量,例如此处使用的 unsigned int
。没有任何分配。
将其与使变量成为 class 的数据成员进行比较,并且仅仅是为了避免该分配。访问该变量涉及通过 this
指针。指针取消引用有成本,可能远远超过向指针添加偏移量的成本。取消引用可能会导致缓存未命中。更糟糕的是,每次引用变量时都可能执行此取消引用。
也就是说,有时最好只是为了避免各种成员函数中的自动变量而创建数据成员。声明为局部自动变量的大型数组很可能会导致堆栈溢出。但是请注意,使 double big_array[2000][2000]
成为 MyClass
的数据成员很可能会使 MyClass
类型的变量无法在某些函数中声明为局部自动变量。
将大型数组放在堆栈上所产生的问题的标准解决方案是将它们分配在堆上。这导致另一个地方创建数据成员以避免局部变量可能是有益的。虽然堆栈分配非常快,但堆分配(例如 new
)非常慢。使自动变量 std::unique_ptr<double> big_array = std::make_unique<double>(2000*2000)
成为 MyClass
.
的数据成员可能会使重复调用的成员函数受益
请注意,以上均不适用于问题中的示例代码。另请注意,最后一个问题(使堆分配变量成为数据成员以避免重复分配和释放)意味着代码必须通过 this
指针来访问该内存。在紧凑的代码中,有时我不得不创建一个本地自动指针变量,例如 double* local_pointer = this->some_pointer_member
以避免重复遍历 this
.
class MyClass {
private:
unsigned int currentTimeMS;
public:
void update() {
currentTimeMS = getTimeMS();
// ...
}
};
class MyClass {
public:
void update() {
unsigned int currentTimeMS = getTimeMS();
// ...
}
};
update() 在主游戏循环中调用,因此在第二种情况下我们会进行大量分配操作(unsigned int currentTimeMS)。在第一种情况下,我们只获得一个分配并使用之前分配的变量。 这段代码中哪一个更好用?为什么?
在第一个示例中,您正在保存此 class 对象的状态。在第二个中,你不是,所以 currentTime 会在调用即时 update() 时丢失。
真正由您决定需要哪一个。
我推荐第二种,因为它是无状态的,而且变量的范围更小。仅当您确实遇到性能问题时才使用第一个,我认为这不太可能。
如果您以后不修改变量值,您还应该考虑将其设为const
,以便在您的代码中表达此意图并为编译器提供额外的优化选项。
第一种情况是定义成员变量,第二种情况是局部变量。基本 class 东西。 class 中的任何函数(方法)都可以使用私有成员变量。局部变量仅在声明它的函数中可用。
这取决于您的需求。如果 currentTimeMS
在 update()
中 暂时 需要,那么一定要在那里声明它。 (在你的情况下,#option2)
但是 如果 class 的实例需要它的值(即在其他方法中使用),那么您应该将其声明为一个字段(在你的情况下,#option1).
Which of this code better to use and why?
首先,引用的代码充其量只是一个微小的微优化。除非万不得已,否则不要担心这些事情。
事实上,这很可能是一种不优化。有时自动变量分配在堆栈上。堆栈分配非常快(有时甚至是免费的)。不用担心。其他时候,编译器可能会在寄存器中放置一个小的自动变量,例如此处使用的 unsigned int
。没有任何分配。
将其与使变量成为 class 的数据成员进行比较,并且仅仅是为了避免该分配。访问该变量涉及通过 this
指针。指针取消引用有成本,可能远远超过向指针添加偏移量的成本。取消引用可能会导致缓存未命中。更糟糕的是,每次引用变量时都可能执行此取消引用。
也就是说,有时最好只是为了避免各种成员函数中的自动变量而创建数据成员。声明为局部自动变量的大型数组很可能会导致堆栈溢出。但是请注意,使 double big_array[2000][2000]
成为 MyClass
的数据成员很可能会使 MyClass
类型的变量无法在某些函数中声明为局部自动变量。
将大型数组放在堆栈上所产生的问题的标准解决方案是将它们分配在堆上。这导致另一个地方创建数据成员以避免局部变量可能是有益的。虽然堆栈分配非常快,但堆分配(例如 new
)非常慢。使自动变量 std::unique_ptr<double> big_array = std::make_unique<double>(2000*2000)
成为 MyClass
.
请注意,以上均不适用于问题中的示例代码。另请注意,最后一个问题(使堆分配变量成为数据成员以避免重复分配和释放)意味着代码必须通过 this
指针来访问该内存。在紧凑的代码中,有时我不得不创建一个本地自动指针变量,例如 double* local_pointer = this->some_pointer_member
以避免重复遍历 this
.