我应该在函数中还是全局初始化变量?
Should I initialize a variable in a function or globally?
我正在用 C++ 编写自己的游戏引擎,我想知道我应该在哪里初始化每一帧都需要的变量,例如,每次鼠标指针移动时,指针位置的坐标应该保存在一个变量。
我应该在全局初始化变量还是在它总是初始化变量 new 的函数中初始化变量?好处在哪里,坏处在哪里?
float offsetX
float offsetY
void mouse_callback(double posX, double posY) {
offsetX = posX - lastX;
offsetY = lastY - posY;
lastX = posX;
lastY = posY;
}
或
void mouse_callback(double posX, double posY) {
float offsetX = posX - lastX;
float offsetY = lastY - posY;
lastX = posX;
lastY = posY;
}
这是一个关于优化与可读性的问题。将变量作为 class 成员会稍微快一些。但可读性要求仅在需要时才创建变量。只要不需要速度上的微小提升,都保留在函数中。
局部变量显示在所有调试器中(全局不显示)并且比全局变量更快,但局部变量的可用内存较少,您可以在不同的函数中使用它们。选择最适合你的。
这完全取决于您的代码。
如果您只在一个函数(或 class)中需要这些变量,请在其中初始化它们。但是如果你需要它在多个函数(全局)上,你可以全局初始化它们。
使用较少的全局变量(通常)可以使您的代码更高效、更快和更安全。搜索 Google(或像我一样 Bing!)搜索 "global variables" 以获取更多信息。
变量的定义应尽可能接近它们的使用位置。声明和初始化之间的距离越长,代码越容易出错。
在函数中定义变量的一个好处是,您可以将它们标记为 const
(!)。然后你通知代码的读者,这些变量永远不会改变。
请记住,您是为人而不是为编译器编写代码。对于这个简单的用例,内存和速度上可能 没有 差异 - 编译器将能够优化变量。
Should I initialize the variable for that globally or in the function where it always initializes the variable new?
我认为您混淆了初始化和声明。查看您的代码:
void mouse_callback(double posX, double posY) {
float offsetX = posX - lastX;
float offsetY = lastY - posY;
lastX = posX;
lastY = posY;
}
在这里,你声明 offsetX
和 offsetY
为局部变量,并将它们初始化为 posX - lastX
等。但是随后您无需对这些变量做任何进一步的操作,一旦 mouse_callback()
退出,您计算的值就会消失。如果您实际上在实际代码中的 mouse_callback()
中使用了 offsetX
和 offsetY
并且您在其他任何地方都不需要它们,那可能没问题。但是如上所述,您可以只删除函数主体中的前两行,函数的行为仍然完全相同。
lastX
和 lastY
显然意味着具有更长生命周期的变量(即全局变量或 class 中的实例变量),因为您在 [=14= 中使用它们] 没有声明它们或初始化它们。在调用 mouse_callback()
之前,这些显然需要具有有效值,因为您在前两行中使用了它们。
一般来说,您需要知道的主要事情是 所有 变量在您使用它们的值之前需要被初始化,即给定有效值。除了初始化速度可能很慢或资源密集的对象外,没有太多理由在声明变量时不对其进行初始化,无论它们是全局的还是局部的,这样做将帮助您避免难以跟踪的错误下来。
我正在用 C++ 编写自己的游戏引擎,我想知道我应该在哪里初始化每一帧都需要的变量,例如,每次鼠标指针移动时,指针位置的坐标应该保存在一个变量。
我应该在全局初始化变量还是在它总是初始化变量 new 的函数中初始化变量?好处在哪里,坏处在哪里?
float offsetX
float offsetY
void mouse_callback(double posX, double posY) {
offsetX = posX - lastX;
offsetY = lastY - posY;
lastX = posX;
lastY = posY;
}
或
void mouse_callback(double posX, double posY) {
float offsetX = posX - lastX;
float offsetY = lastY - posY;
lastX = posX;
lastY = posY;
}
这是一个关于优化与可读性的问题。将变量作为 class 成员会稍微快一些。但可读性要求仅在需要时才创建变量。只要不需要速度上的微小提升,都保留在函数中。
局部变量显示在所有调试器中(全局不显示)并且比全局变量更快,但局部变量的可用内存较少,您可以在不同的函数中使用它们。选择最适合你的。
这完全取决于您的代码。
如果您只在一个函数(或 class)中需要这些变量,请在其中初始化它们。但是如果你需要它在多个函数(全局)上,你可以全局初始化它们。
使用较少的全局变量(通常)可以使您的代码更高效、更快和更安全。搜索 Google(或像我一样 Bing!)搜索 "global variables" 以获取更多信息。
变量的定义应尽可能接近它们的使用位置。声明和初始化之间的距离越长,代码越容易出错。
在函数中定义变量的一个好处是,您可以将它们标记为 const
(!)。然后你通知代码的读者,这些变量永远不会改变。
请记住,您是为人而不是为编译器编写代码。对于这个简单的用例,内存和速度上可能 没有 差异 - 编译器将能够优化变量。
Should I initialize the variable for that globally or in the function where it always initializes the variable new?
我认为您混淆了初始化和声明。查看您的代码:
void mouse_callback(double posX, double posY) { float offsetX = posX - lastX; float offsetY = lastY - posY; lastX = posX; lastY = posY; }
在这里,你声明 offsetX
和 offsetY
为局部变量,并将它们初始化为 posX - lastX
等。但是随后您无需对这些变量做任何进一步的操作,一旦 mouse_callback()
退出,您计算的值就会消失。如果您实际上在实际代码中的 mouse_callback()
中使用了 offsetX
和 offsetY
并且您在其他任何地方都不需要它们,那可能没问题。但是如上所述,您可以只删除函数主体中的前两行,函数的行为仍然完全相同。
lastX
和 lastY
显然意味着具有更长生命周期的变量(即全局变量或 class 中的实例变量),因为您在 [=14= 中使用它们] 没有声明它们或初始化它们。在调用 mouse_callback()
之前,这些显然需要具有有效值,因为您在前两行中使用了它们。
一般来说,您需要知道的主要事情是 所有 变量在您使用它们的值之前需要被初始化,即给定有效值。除了初始化速度可能很慢或资源密集的对象外,没有太多理由在声明变量时不对其进行初始化,无论它们是全局的还是局部的,这样做将帮助您避免难以跟踪的错误下来。