gpt4 book ai didi

c++ - 局部作用域静态变量的零初始化和静态初始化

转载 作者:可可西里 更新时间:2023-11-01 16:31:07 26 4
gpt4 key购买 nike

我从 Google 阅读了几篇关于 C++ 初始化 的文章,其中一些指导我在 StackOverflow 上。我从这些帖子中挑选的概念如下:

  • C++初始化的顺序是:
    1. 零初始化
    2. 静态初始化
    3. 动态初始化
  • 静态对象(包括变量)首先被零初始化,然后是静态初始化

我有几个关于初始化问题的查询(存储类问题也可能相关):

  • 全局对象(定义时没有使用 static 关键字)也是静态对象,对吧?
  • 全局对象也像静态对象一样通过上面两步初始化,对吧?
  • 什么是静态初始化?它是指初始化静态对象(使用 static 关键字定义)吗?
  • 我还读到,当执行线程首次进入 block 时,使用 static 关键字在 block 内(即在函数中)定义的对象被初始化!这意味着 local static objectsma​​in 函数执行之前不会被初始化。这意味着它们没有像上面提到的两个步骤那样被初始化,对吧?
  • 动态初始化是指初始化new操作符创建的对象吧?它可能指的是像 myClass obj = myClass(100);myClass obj = foo();
  • 这样的初始化

我对初始化和存储类说明符问题有太多的询问。我阅读了 C++2003 标准文档,但找不到清晰的逻辑,因为它们散布在整个文档中。

我希望你能给我一个逻辑上解释存储类说明符和初始化的整个映射的答案。欢迎任何引用!

可以解释我的问题的代码:

class myClass{
public:
int i;
myClass(int j = 10): j(i){}
// other declarations
};

myClass obj1;//global scope
static myClass obj2(2);//file scope
{ //local scope
myClass obj3(3);
static myClass obj4(4);
}

编辑:
如果你觉得我的问题比较繁琐,你可以根据上面的代码帮忙解释一下你的想法。

最佳答案

I read several posts on C++ initialization from Google, some of which direct me here on StackOverflow. The concepts I picked from those posts are as follows:

  • The order of initialization of C++ is:
    1. Zero Initialization;
    2. Static Initialization;
    3. Dynamic Initialization.

是的,确实有 3 个阶段(在标准中)。在继续之前让我们澄清一下:

  • 零初始化:内存在字节级用0填充。
  • 常量初始化:在对象的内存位置复制一个预先计算的(编译时)字节模式
  • 静态初始化:零初始化后常量初始化
  • 动态初始化:执行一个函数来初始化内存

一个简单的例子:

int const i = 5;     // constant initialization
int const j = foo(); // dynamic initialization
  • Static objects (variables included) are first Zero-initialized, and then Static-initialized.

是也不是。

标准要求对象首先被零初始化,然后它们是:

  • 如果可能的话初始化常量
  • 否则动态初始化(编译器无法在编译时计算内存内容)

注意:在常量初始化的情况下,编译器可能会按照 as-if 规则忽略第一个零初始化内存。

I have several inquiries as to the initialization issue (storage class issue may be related as well):

  • Global objects (defined without static keyword) are also static objects, right?

是的,在文件范围内,static 对象只是符号的可见性。全局对象可以通过名称从另一个源文件中引用,而 static 对象名称对于当前源文件来说是完全本地的。

混淆源于世界 static 在许多不同情况下的重用 :(

  • Global objects are also initialized like static objects by two steps like above, right?

是的,事实上本地静态对象也是如此。

  • What is the Static Initialization? Does it refer to initializing static objects (defined with static keyword)?

不,如上所述,它指的是在不执行用户定义的函数的情况下初始化对象,而是将预先计算的字节模式复制到对象的内存中。请注意,对于稍后将动态初始化的对象,这只是将内存归零。

  • I also read that objects defined within block (i.e. in a function) with static keyword is initialized when the execution thread first enters the block! This means that local static objects are not initialized before main function execution. This means they are not initialized as the two steps mentioned above, right?

它们是用两步过程初始化的,尽管实际上只有第一次执行通过它们的定义。所以过程相同,但时间略有不同。

但在实践中,如果它们的初始化是静态的(即,内存模式是编译时模式)并且它们的地址未被获取,则它们可能会被优化掉。

请注意,在动态初始化的情况下,如果它们的初始化失败(应该初始化它们的函数抛出异常),将在下一次流控制通过它们的定义时重新尝试。

  • Dynamic initialization refers to initialization of objects created by new operator, right? It might refer to initialization like myClass obj = myClass(100); or myClass obj = foo();

根本不是,它指的是需要执行用户定义函数的初始化(注意:就 C++ 语言而言,std::string 具有用户定义的构造函数)。

编辑: 感谢 Zach 指点我,我错误地将 C++11 标准称为常量初始化的静态初始化;现在应该修复此错误。

关于c++ - 局部作用域静态变量的零初始化和静态初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17801075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com