zoukankan      html  css  js  c++  java
  • C++变量的“总分性”(Mereology)

    Stroustrup 在自传中说自己在哲学上深受 Kierkegaard (吉爾凱高爾)的影响,而讨厌黑格尔。所以看 Stroustrup 的书,很少感受到抽象理论的重要性。这也影响了C++的文化:许多C++程序员很会写代码,但是概念说不清楚,感觉生活很难( :)。 这多多少少怪C++的鼻祖 Stroustrup 本人。

    闲话少说,关于C++变量的属性问题,是C++最根本的问题。然而我还没有读过一本书能从抽象,理论高度说清楚的。今天我就试图谈谈C++变量的属性。我认为,每个C++变量有六个无法分离的属性(把合并),理解了,你就入了C++的门:

    数据类型和名字

                   C++中没有“未知类”变量

                   C++的变量用名字的唯一性来辨识,同一scope中没有同名的变量

    存储类型(storage class)

                   数据段(data segment)变量

                   堆栈(stack) 变量

                   堆叠(heap) 变量:(只能是分变量)

    适用范围(scope):

                  1。默认名空间( ::  namespace)

                  2。命名空间( named namespace)

                  3。无名空间(anonymous namespace):文件变量

                  4。型 (static class variable or type variable)

                  5。实例(instance class member variable)

                  6。函数内 - 静态 (static variable in a function)

                  7。函数内(或代码块内)- 动态 (auto variable or stack variable)

    生命周期

                   程序初始至结束:global

                   代码块(code block): auto

                   New/delete: free

                   第一次使用至程序结束: static in function

    内容:

                   直接内容

                                  直接变量

                   间接内容

                                  指针变量

                                  引用变量

    总分性(Mereology)

                   总(whole variable)变量

                  分(part variable)   变量:即成员变量

    前四个属性都有著述,而第五,六个属性似乎无人或鲜有人提出。

    关于“总分性”,该词这是我在查Mereology翻译时找到的唯一较好的翻译。我几乎找不到有前人论述的信息(知道的请告诉我)。

    他的意思是“总体”与“部分”的关系。翻译成总部也不好,总分亦不完美,但是比总部稍稍谦虚点:)

    有了这个概念,我们可以进一步区分两种变量:

    A. 独立变量:是个总体,不属于任何变量,或可称为“母变量”

    B. 成员变量:是个部分体,隶属一个总变量,或可称为“子变量”

    为什么总分性对于一个变量很重要呢?因为:

    1) 一个存储属性为 Heap 的变量只能为子变量。

    A* pA = new A;  //line1

     

    pA是指针变量,它本身不在heap中,它只是“指向Heap地址”。

    如果A定义为 class A { B b;}那么line1导致了子变量b的存储属性是Heap.

    从另一个角度说,Heap中的母变量总是无名的,它只有通过指针间接地存在。

    2) 子变量的存储属性决定于母变量的存储属性

    比如 class A { }; class B { A *pA; };foo(){B b;}

    作为母变量,存储属性是堆栈,而它的子变量 pA,也在堆栈中。如果B *b = new B,那么 pA 的属性就是 Heap

    3)子变量在运行时可以被优化成其母变量的“”,所以它的读/写是通过它的母变量进行的,不用单独“取址”(即按名取址),性能较母变量稍好。

    比如b.f1可以被优化为b+offsetof(f1), f1在运行时被“抹去名字”。

    总之

    理解C++变量的六大属性,是深入理解C++变量,也是C++语义的重要一环。由于“总分性”的概念不为专家强调,这里专门著文小序,以期抛砖引玉。

  • 相关阅读:
    Docker和K8S
    CoBot 库博源代码缺陷检测工具
    Hobot软件成分分析平台
    Black duck(黑鸭子软件)开源代码审计管理测试平台
    python之理解super及MRO列表
    Python中MRO排序原理
    python中with的用法
    使用微服务架构重构支付网关
    支付网关的设计原则
    python内存管理--垃圾回收
  • 原文地址:https://www.cnblogs.com/ly8838/p/3994054.html
Copyright © 2011-2022 走看看