zoukankan      html  css  js  c++  java
  • c++ 静态变量只初始化一次的原理

    转载至:https://www.cnblogs.com/dongzhiquan/p/4331206.html

    童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量只初始化一次。你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住。告诉你,你为什么总是记不住,因为你没有正真理解静态变量的原理, 所以下面我就来告诉大家它的原理,直接上代码:
    [code=C/C++]
    #include "stdafx.h"


    int _tmain(int argc, _TCHAR* argv[])
    {
        int initNum = 3;
        for (int i=5; i > 0; --i)
        {
            static int n1 = initNum;
            n1++;
            printf("%d ", n1);
        }


        getchar();
        return 0;
    }
    [/code]
    输出结果:
    4
    5
    6
    7
    8


    在这里我们可以看到虽然代码循环了5次,静态变量n1确实只初始化了一次。那么为什么呢?继续上代码,相信大家就会明白些许了。
    [code=C/C++]
    int _tmain(int argc, _TCHAR* argv[])
    {
        int initNum = 3;
        for (int i=5; i > 0; --i)
        {
            static int n1 = initNum;


            //我们在这里了两句代码
            int* p = &n1;
            p++;
            *p = 0;
            //end


            n1++;
            printf("%d ", n1);
        }


        getchar();
        return 0;
    }
    [/code]
    输出结果:
    4
    4
    4
    4
    4


    这次,静态变量居然跟随着5次循环也初始化了5次。你一定非常诧异,其实我们不难推断,其实静态变量就是通过静态变量后面的一个32位内存位来做记录,以标识这个静态变量是否已经初始化。而我们的p++;*p = 0;却每次都将这个值赋值为0,所以程序就一直认为n1一直没有被初始化过,并每次都初始化一次。看一下内存,就更明了了:
    0x00E8716C  03 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 b0 e7 1e 6a 00 00 00
    这里的内存地址就是静态变量n1的地址,值是3,后面还有一个1,你看到了吗,这个就是程序用来记录该静态变量是否初始化的标识位啦。现在你一定明白原理了,并且能轻松记住静态变量的特性了吧?
    童鞋们还可以试一下,多个静态变量时,标识位的表示形式,以深入学习(透露一下,每一位标识一个静态变量的初始化状态)。

    以上代码有一点需要说明:代码中之所以要用int initNum = 3;而不是直接用static int n1 = 3;是因为如果给静态变量直接赋值一个常量的话,编译器会进行优化,导致程序在一启动时,就初始化好了,不便于我们观察静态变量内存上的改变。

  • 相关阅读:
    linux中关于权限的一些事
    Linux上用IP转发使内部网络连接互联网
    Linux常用基础命令
    linux路径问题
    ansible简介
    linux
    linux常用命令
    ls 命令详解
    Linux 实验 [Day 01]
    Linux SPI通过设备树文件添加设备
  • 原文地址:https://www.cnblogs.com/Zhangyq-yard/p/10851446.html
Copyright © 2011-2022 走看看