zoukankan      html  css  js  c++  java
  • c++ Initialization

    c++ 的初始化过程比较复杂:根据对象的storage duration来分类。所谓storage duration是对象而言的,Storage duration is the property of an object that defines the minimum potential lifetime of the storage containing the object。跟lifetime密切相关,但是lifetime是具体的对象生存期。而storage duration是生存期的类型。一个是抽象的概念,一个是具体的概念,属于正交。

    All non-local variables with static storage duration are initialized as part of program startup, before the execution of the main function begins. non-local 对象包括global variable, non-local static variable, namespace variable. 

    其中non local static duration的variable的初始化规则有: 

    1. zero Initialization:也就是初始化为0

    2. const Initialization:如果是int i=4,那么在编译期就初始化了

    以上都属于static Initialization初始化.

    After all static initialization is completed, dynamic initialization of non-local variables occurs in the following situations:

    int i=func()

    那么non-loca static duration的variable变量呢,只有local scope的static 局部变量,它什么时候初始化?c++标准规定:

    Variables declared at block scope with the specifier static have static storage duration but are initialized the first time control passes through their declaration (unless their initialization is zero- or constant-initialization, which can be performed before the block is first entered). On all further calls, the declaration is skipped.

    这就是惰性初始化

    以上区分的关键点是static duration是否是non-local

    那么根据external linkage 还是internal linkage 判断是否被不同的编译单元可见: global variable是有external的属性的。namespace的global variable也是。还有就是function函数默认是external的

    • names of variables declared extern;
    • names of functions

    那么常见的static修饰的变量和函数都是internal linkage的:

    • variables, functions, or function templates declared static;

    归纳static关键字的作用:

    static class member    static class function     static object(non-local and local)   static normal function

    // inside some .cpp file:
    
    static void foo();    // old "C" way of having internal linkage
    
    // C++ way:
    namespace
    {
       void this_function_has_internal_linkage()
       {
          // ...
       }
    }
     
    View Code
    
    
    
    

  • 相关阅读:
    python实现求解列表中元素的排列和组合
    python3.7 安装dlib和face_recognition
    Python 魔法函数
    python的68个内置函数
    生成器和生成器函数,推倒式
    函数名的应用,闭包,迭代器
    函数的进阶(动态参数,命名空间和作用域,函数的嵌套,gloabal和nonlocal关键字)
    python 函数
    文件操作
    字典和列表的删除问题, 深浅拷贝
  • 原文地址:https://www.cnblogs.com/kkshaq/p/10537698.html
Copyright © 2011-2022 走看看