【问题标题】:Should I initialize a variable in a function or globally? [closed]我应该在函数中还是全局初始化变量? [关闭]
【发布时间】:2020-10-05 00:43:30
【问题描述】:

我正在用 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;
}

【问题讨论】:

  • 拥有的全局变量越少,就越容易推理代码,也就越容易调试代码。但是如果你必须有一个全局变量,它需要在使用之前进行初始化。最佳时间和地点取决于您的代码。

标签: c++ variables memory game-engine


【解决方案1】:

变量的定义应该尽可能接近它们的使用位置。声明和初始化之间的距离越长,代码就越容易出错。

在函数中定义变量的好处是您可以将它们标记为const(!)。然后你通知代码的读者,这些变量永远不会改变。

请记住,您是为人而不是为编译器编写代码。对于这个简单的用例,内存和速度可能没有差异 - 编译器将能够优化掉变量。

【讨论】:

  • 谢谢! @Mikael H 这对我有很大帮助。名言:“记住你是为人而不是为编译器编写代码”让我大开眼界!
【解决方案2】:

这完全取决于您的代码。
如果您只在一个函数(或类)中需要这些变量,请在其中初始化它们。但是,如果您需要在多个函数(全局)上使用它,则可以全局初始化它们。
使用更少的全局变量(通常)会使你的代码更高效、更快、更安全。在 Google(或像我一样的 Bing!)中搜索“全局变量”以获取更多信息。

【讨论】:

  • 没有人需要全局变量
  • 他写的是 C++ 而不是 C,这是 21 世纪。另外,如果他需要函数外部的变量,他不会考虑只在函数中定义它们。
  • @JoKing 他询问了差异,我说了其中的一些。我没有写你必须使用全局变量;我写了可能
【解决方案3】:

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

我认为您将 initializationdeclaration 混淆了。查看您的代码:

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 显然是具有较长生命周期的变量(即全局变量或类中的实例变量),因为您在 mouse_callback() 中使用它们而无需声明它们或初始化它们。这些显然需要在调用 mouse_callback() 之前具有有效值,因为您在前两行中使用了它们。

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

【讨论】:

    【解决方案4】:

    这是一个关于优化与可读性的问题。将变量作为类成员会稍微快一些。但可读性要求仅在需要时创建变量。只要您不需要稍微提高速度,就将它们保留在函数中。

    【讨论】:

    • 虽然示例中没有类。这是关于全局变量与局部变量的关系。
    • 这个问题是关于全局与本地的,它没有提到类或成员。并且类成员比局部变量更快是不正确的。
    • 好吧,他最好使用一个类;)......无论如何......它同样适用
    • 从例子中也不清楚,没有类。只有全局这个词让你假设没有。由于我不确定 OP 是否知道全局这个词的含义,所以我将其翻译为“函数外”并假设他在即将实现整个游戏引擎时使用类。我可以拿回我的选票吗? :P
    【解决方案5】:

    局部变量显示在所有调试器中(全局没有)并且比全局变量更快,但是局部变量的可用内存较少,您可以在不同的函数中使用它们。选择更适合您的。

    【讨论】:

    • 能支持“局部变量比全局变量快”吗?
    • 有栈内存和堆内存。由于实现,堆栈比堆工作得更好(为堆栈分配内存更快,请参阅pointers)。
    • @DenisTereshchenko No
    • @DenisTereshchenko Globals 只分配一次。在实践中,基于堆栈的琐碎对象都是通过移动堆栈指针一次性分配的。全局和本地分配时间都与琐碎的对象无关。
    • @DenisTereshchenko 感谢您的贡献。继续阅读、提问和回答……新用户让网站保持强大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    相关资源
    最近更新 更多