设为首页 加入收藏

TOP

C++变量的“总分性”(Mereology)
2015-07-20 17:36:37 来源: 作者: 【 】 浏览:3
Tags:变量 总分 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;}
?
b 作为母变量,存储属性是堆栈,而它的子变量 pA,也在堆栈中。如果B *b = new B,那么 pA 的属性就是 Heap。
?
?
?
3)子变量在运行时可以被优化成其母变量的“域”,所以它的读/写是通过它的母变量进行的,不用单独“取址”(即按名取址),性能较母变量稍好。
?
比如b.f1可以被优化为b+offsetof(f1), f1在运行时被“抹去名字”。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇[数位dp] lightoj 1205 Palindrom.. 下一篇[数位dp+二分] fzu 1074 Nancy..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·PostgreSQL 索引 - (2025-12-25 22:20:43)
·MySQL Node.js 连接 (2025-12-25 22:20:41)
·SQL 撤销索引、表以 (2025-12-25 22:20:38)
·Linux系统简介 (2025-12-25 21:55:25)
·Linux安装MySQL过程 (2025-12-25 21:55:22)