我应该在函数中还是全局初始化变量?

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;
}

在这里,你声明 offsetXoffsetY 为局部变量,并将它们初始化为 posX - lastX 等。但是随后您无需对这些变量做任何进一步的操作,一旦 mouse_callback() 退出,您计算的值就会消失。如果您实际上在实际代码中的 mouse_callback() 中使用了 offsetXoffsetY 并且您在其他任何地方都不需要它们,那可能没问题。但是如上所述,您可以只删除函数主体中的前两行,函数的行为仍然完全相同。

lastXlastY 显然意味着具有更长生命周期的变量(即全局变量或 class 中的实例变量),因为您在 [=14= 中使用它们] 没有声明它们或初始化它们。在调用 mouse_callback() 之前,这些显然需要具有有效值,因为您在前两行中使用了它们。

一般来说,您需要知道的主要事情是 所有 变量在您使用它们的值之前需要被初始化,即给定有效值。除了初始化速度可能很慢或资源密集的对象外,没有太多理由在声明变量时不对其进行初始化,无论它们是全局的还是局部的,这样做将帮助您避免难以跟踪的错误下来。