程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++變量的“總分性”(Mereology)

C++變量的“總分性”(Mereology)

編輯:C++入門知識

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;}   b 作為母變量,存儲屬性是堆棧,而它的子變量 pA,也在堆棧中。如果B *b = new B,那麼 pA 的屬性就是 Heap。       3)子變量在運行時可以被優化成其母變量的“域”,所以它的讀/寫是通過它的母變量進行的,不用單獨“取址”(即按名取址),性能較母變量稍好。   比如b.f1可以被優化為b+offsetof(f1), f1在運行時被“抹去名字”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved