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
    
    
    
    

  • 相关阅读:
    剑指offer:面试题25、二叉树中和为某值的路径
    剑指offer:面试题24、二叉搜索树的后续遍历序列
    剑指offer:面试题23、从上往下打印二叉树
    剑指offer:面试题22、栈的压入、弹出序列
    剑指offer:面试题21、包含min函数的栈
    剑指offer:面试题20、顺时针打印矩阵
    剑指offer:面试题19、二叉树的镜像
    剑指offer:面试题18、树的子结构
    剑指offer:面试题17、合并两个排序的链表
    剑指offer:面试题16、反转链表
  • 原文地址:https://www.cnblogs.com/kkshaq/p/10537698.html
Copyright © 2011-2022 走看看