首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态和动态初始化是否仅适用于非局部变量?

静态和动态初始化是否仅适用于非局部变量?
EN

Stack Overflow用户
提问于 2017-08-10 14:40:54
回答 1查看 530关注 0票数 6

代码如下:

代码语言:javascript
复制
int factorial(int n)
{
     if ( n < 0 )       return -1; //indicates input error
     else if ( n == 0 ) return 1;
     else               return n * factorial(n-1);
}

int const a = 10 ; //static initialization 
             //10 is known at compile time. Its 10!

int const b = factorial(8); //dynamic initialization 
                      //factorial(8) isn't known at compile time,
                      //rather it's computed at runtime.

(从here窃取)

所以对我来说,为什么b是动态初始化的,而a是静态初始化的,这是有道理的。

但是,如果ab具有自动存储持续时间(可能它们已经在main()中初始化),那么您仍然可以将它们的初始化称为静态或动态吗?因为,对我来说,它们听起来像是一个更通用的初始化名称,而不是例如复制初始化。

另外,我读过this,谁能告诉我为什么他们没有直接解释什么是静态和动态初始化?我的意思是,看起来他们只解释了在什么情况下会发生这种情况,但也许有原因?

cppreference声明初始化器可能会调用(一些初始化,如值初始化等),但在本文后面,他们提到静态和动态初始化,就好像这两个是某些初始化的更通用的名称。这听起来可能令人困惑,但这里我已经说明了我所理解的:

(不是最美的东西)

EN

回答 1

Stack Overflow用户

发布于 2017-08-10 15:11:41

静态和动态初始化描述了加载二进制文件并到达准备运行main时的过程。

静态初始化描述了编译器在编译时可以计算出的信息,并允许将固定值存储在二进制文件中,以便在操作系统加载二进制文件时,它具有正确的值。

动态初始化描述了编译器在主程序运行前插入的代码,它初始化了编译器无法计算的信息。这可能是因为它直接涉及代码,或者它引用了编译器在编译时不可见的信息。

,但如果a和b有自动存储持续时间呢?

当a是有限范围的自动变量时的简单情况。

代码语言:javascript
复制
int a = 12;

这不能被静态初始化,因为编译器不知道在哪里初始化,因为每次在调用它的每个线程上都是不同的。

编译器将能够用类似这样的东西初始化。

代码语言:javascript
复制
  mov (_addr_of_a), 12

由于_addr_of_a在运行时之前是未知的,并且值12嵌入在代码中,因此不会执行静态初始化它的情况。

更复杂的案例..。

代码语言:javascript
复制
int a[] = { /* some integer values */ };

这可能会被编译器实现为静态和动态代码的混合,如下所示。

代码语言:javascript
复制
static int a_init = { /* some integer values */ };
memcpy( a, a_init, length_in_bytes_of_a );

因此,在某些情况下,静态初始化会“泄漏”到运行时行为中。

动态行为更有问题-它假设一个函数通常不公开其实现,具有较慢的执行时间,并且是一个在结果开始时为缓存赋值的constexpr。我还没有见过这样的优化。

静态和动态初始化是描述创建运行程序的过程的技术术语。局部变量可能存在类似的模式,但它们不属于staticdynamic初始化的技术定义。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45606261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档