常量声明全局或在使用它的函数内声明之间有什么区别

时间:2017-08-31 04:15:24

标签: c++ c ada

我在函数内声明一个常量(一个包含字符串的大型结构常量),它只在这个函数中使用。 它对我的程序有任何执行时间影响吗? ' 它们将在每次调用函数时生成(需要更多时间)或仅创建一次,并且引用将在其生命周期中使用。 如果我在函数外部声明常量(全局),它的执行速度会更快吗?

4 个答案:

答案 0 :(得分:1)

实际上,在函数内声明变量是一种很好的做法。如果该变量当然只用于该函数内部。两种方法之间没有任何性能差异,但是使全局不变可能需要更具创造性的命名方案,而函数内部的命名方案可能是通用的。毕竟,它仅用于该功能内部。

答案 1 :(得分:1)

如果任何其他相关函数使用该变量,我会亲自将其移出函数体,只要您使用名称空间即可。

另外如果它是一个真正的常量,我相信你可以声明一个struct static constexpr,这意味着每次调用该函数时它都不会被分配在堆栈上(静态),即使你在函数内部声明它身体。它还意味着它可以在编译时使用,它将是(constexpr)。

#include <iostream>

namespace Test{
struct Test {
  char name[11];
  int a;
  int b;
};

static constexpr Test TEST_CONSTEXPR = {
  "test value",
  5,
  6
};
}

int main()
{
  std::cout << Test::TEST_CONSTEXPR.name << std::endl;
  std::cin.get();
  return 0;
}

答案 2 :(得分:1)

static struct可以帮助您设置一次并完成它。这将来自数据段并在启动期间初始化。下面的原始和脏代码,但会给你一些直觉。

#include <stdio.h>

 struct A {
     int a;
     int b;
 };

 void func(void)
 {
     static struct A a = {5,3};
     printf("FUNC: A.a: %d\n", a.a);
 }

 int main(int argc, char **argv)
 {
     static struct A a = {6,4};
     printf("MAIN: A.a: %d\n", a.a);
     func();
     return 0;
 }

答案 3 :(得分:1)

在Ada中,这取决于编译器。 (通常表现为。)

由于“常量”不是编译时静态的,因此每次声明常量时,编译器都可以执行安全操作并评估初始化表达式。

如果确实很重要,请衡量编译器的作用。