【问题标题】:Do static and dynamic initialization only apply to non-local variables?静态和动态初始化是否仅适用于非局部变量?
【发布时间】:2018-01-18 06:18:59
【问题描述】:

代码如下:

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 声明初始化程序可能调用(一些初始化,如值初始化等),但在本文后面,他们提到静态和动态初始化,好像这两个是一些初始化的更通用名称。这听起来可能令人困惑,但在这里我已经说明了我的理解:

(不是最美的东西)

【问题讨论】:

  • 其实b也是静态的,因为static在C++中有不同的含义。而且它们都不是“编译时间常数”。
  • 该部分称为“非局部变量”。你还需要更多的线索吗?
  • @molbdnilo 是的,虽然我已经看到了......但他们没有直接解释任何事情......好像有点模棱两可
  • 相反,他们解释了所有需要知道的事情。请注意,“静态”和“动态”描述何时。 “复制初始化”是如何
  • 我打赌他们会这样做,但我不明白为什么他们不直接说明局部变量是否也可以静态或动态初始化,以及静态和动态初始化是什么的描述。正如我上面提到的,对我来说,它们似乎只说明了非局部变量发生动态和静态初始化的情况。

标签: c++


【解决方案1】:

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

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

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

但是如果 a 和 b 有自动存储持续时间会怎样

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

int a = 12;

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

编译器将能够使用类似的东西来初始化 a。

  mov (_addr_of_a), 12

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

更复杂的案例...

int a[] = { /* some integer values */ };

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

static int a_init = { /* some integer values */ };
memcpy( a, a_init, length_in_bytes_of_a );

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

动态行为更成问题 - 它假定一个函数通常不公开其实现,执行时间很慢,并且是 constexpr 以在结果开始时为缓存提供价值。我还没有看到这种优化发生。

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

【讨论】:

  • 所以你说静态和动态初始化只适用于非局部变量?
猜你喜欢
  • 1970-01-01
  • 2013-07-21
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
相关资源
最近更新 更多