• C++高级进阶 第四季:const具体解释(二) 常量折叠


    一、文章来由

    const具体解释之二

    二、const 取代 #define

    const最初动机就是取代 #define。

    const 优于 #define:
    (1) #define没有类型检查,const在编译期(而不是预编译期)做类型检查。

    (2)const方便调试和定位bug。

    所以应该全然用const取代#define

    三、头文件里的const

    (1)要使用const取代#define。相同须要把const定义放进头文件(或其它格式文件,include就可以)。

    这样通过包括头文件。可把const定义单独放在一个地方并把它分配给一个编程单元。

    (2)C++中的const默觉得内部连接(internal linkage),也就是说 const 仅在被定义过的文件里才可见,而在连接时不能被其它编译单元看到。

    可是在c中只在还有一个文件里定义(不用extern修饰),还有一个文件也是合法的。c中const是必需分配内存的,而c++实际上一開始是不会分配内存的,不过存在字符表中。

    //another.c
    const int a = 5;
    
    //other.c
    #include <stdio.h>
    
    int main()
    {
        extern const int a;
        printf("%d
    ",a);
    
        return 0;
    }
    

    (3)定义一个const时。必须赋一个值给它,除非用extern做说明:extern const int bufsize;

    这里写图片描写叙述

    四、常量折叠(constant folding)

    通常C++编译器并不为const创建存储空间,相反它把这个定义保存在它的符号表里,但extern强制进行了存储空间分配。取const地址也会**,这也解释了const具体解释(一)中可以改动const空间。可是cout原值相当于还是去符号表中找。

    由于extern意味着使用外部连接(定义时使用extern),因此必须分配存储空间,这也就是说有几个不同的编译单元应当可以引用它,所以必须有存储空间。

    通常情况下,当extern不是定义的一部分时,不会分配存储空间。假设使用const,那么编译时会进行常量折叠。

    那同文件extern呢

    extern const int a;
    int main()
    {
        //freopen("input.txt","r",stdin);
    
        cout<<a<<endl;
    
        return 0;
    }
    
    const int a = 66;

    由于extern不是定义的一部分,所以个人觉得这也不会分配空间。

    五、为什么const要内部连接

    当然想绝对不为不论什么const分配存储是不可能的,尤其是复杂的结构。所以const的定义必须默认内部连接,即连接仅在特定的编译单元内;否则。由于众多的const在多个cpp文件分配内存,引起连接错误。

    连接程序在多个对象文件看到统一的定义就会“抱怨”。

    然而,由于const默认内部连接,所以连接程序不会跨过编译单元连接那些定义,因此不会有冲突。


    參考资料

    [1] c++编程思想

    [2] http://blog.csdn.net/bestrivenfan/article/details/50951809

  • 相关阅读:
    JavaScript + Table 系列:排序
    asp.net 2.0中傻瓜式使用soap header
    Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
    asp.net 2.0 导出DataTable到Excel中
    ASP.NET实用技巧(一)
    【ASP.NET】基础补习之FileUpload
    ASP.NET AJAX入门系列(8):自定义异常处理
    Linq To Sql进阶系列(五)Store Procedure篇
    Linq To Sql进阶系列(六)用object的动态查询与保存log篇
    深究“通过样式表实现固定表头和列”
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7270664.html
Copyright © 2020-2023  润新知