C++ 常量声明为全局或在使用它的函数内部声明有什么区别

C++ 常量声明为全局或在使用它的函数内部声明有什么区别,c++,c,ada,C++,C,Ada,我在一个函数中声明了一个常量(一个包含字符串的大结构常量),它只在这个函数中使用。 它会对我的程序的执行时间产生影响吗?” 它们将在每次调用函数时创建(需要更多时间)或仅创建一次,并且引用将在其整个生命周期中使用。 如果我在函数外部(全局)声明常量,它的执行速度会更快吗?实际上,在函数内部声明变量是一个很好的实践。当然,如果该变量只在该函数内部使用。这两个方法之间不会有任何性能差异,但使常量全局可能需要更具创造性的命名方案,而函数中的命名方案可以是泛型的。毕竟,它只在该函数内部使用。如果任何其他

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

实际上,在函数内部声明变量是一个很好的实践。当然,如果该变量只在该函数内部使用。这两个方法之间不会有任何性能差异,但使常量全局可能需要更具创造性的命名方案,而函数中的命名方案可以是泛型的。毕竟,它只在该函数内部使用。

如果任何其他相关函数使用该变量,我个人会将其移出函数体,只要您使用的是名称空间

另外,如果它是真常量,我相信您可以声明struct static constexpr,这意味着不会在每次调用函数时在堆栈上分配它(static),即使您在函数体中声明它也是如此。这也意味着在编译时可以使用它的地方,它将是(constexpr)

#包括
名称空间测试{
结构测试{
字符名[11];
INTA;
int b;
};
静态constexpr测试\u constexpr={
“测试值”,
5.
6.
};
}
int main()
{

std::cout
静态结构
可以帮助您设置一次并完成它。这将来自数据段,并在启动时进行初始化。下面是一段原始的脏代码,但会给您一些直觉

#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;
 }
#包括
结构A{
INTA;
int b;
};
无效函数(无效)
{
静态结构A={5,3};
printf(“函数:A.A:%d\n”,A.A);
}
int main(int argc,字符**argv)
{
静态结构A={6,4};
printf(“主:A.A:%d\n”,A.A);
func();
返回0;
}

在Ada中,这取决于编译器(通常是性能)

由于“常量”不是编译时静态的,编译器可能会做一些安全的事情,并在每次声明常量时计算初始化表达式


如果它真的很重要,请测量编译器的操作。< /P>问这个问题并用C++、C和艾达标记问题是没有意义的。它们是不同的语言,答案是非常不同的,例如C或C++字符串文字(不需要运行时分配)和C++ <代码> STD::String < /Calp>S(动态运行时分配)。.因此,请发布一种语言,并向我们展示您所关注的代码,因为细节中存在魔鬼。

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