作者查詢 / GNUGCC
作者 GNUGCC 在 PTT 全部看板的留言(推文), 共704則
限定看板:全部
3F→:LPH66 大大,您的這一行 :09/08 01:32
4F→:operator <<() 的輸出在列印 ptr 指標內容...請問這樣做的09/08 01:35
5F→:意義是?09/08 01:35
7F→:我很好奇的是您希望它做什麼?就以指向類別成員函式的指標來09/08 01:41
8F→:說的話?09/08 01:41
9F→:還有就是您的 double 資料也是用它來輸出,這個意義是什麼呢09/08 01:45
12F→:「印出指標內容」跟「印出指標指向的內容」,您是那一個呢?09/08 01:51
13F→:看起來比較像是「印出指標指向的內容」耶...09/08 01:54
21F→:我在前面有說過編譯器的實作技術會有不同,LPH66 大不知道是09/08 10:16
22F→:用那種的編譯器導致看到了「包裝後的結果」,不過我在用09/08 10:16
23F→:Visual C++ 2008 以 Debug 模式啟動可以很清楚看到函式位址09/08 10:18
24F→:,相信這方面 descent 大也有看過,並且也用了特殊的轉換方式09/08 10:21
25F→:取得位址並可呼叫到該函式,即然有部份人覺得指標可能不是存09/08 10:22
26F→:位址那也無仿,必竟這個是編譯器的職責跟使用者無直接關連,09/08 10:24
27F→:因為我在前面也說過,「不管編譯器實作技術是什麼,都不會影09/08 10:25
28F→:響程式執行結果」.09/08 10:25
31F→:F 大可以用 Debug 模式啟動作細部觀察可以發現不一樣的東西09/08 10:41
33F→:當然有關係,您看了就知道.09/08 10:45
35F→:好吧,那就看得懂的人就學到了一門課,看不懂的人也無仿,只要09/08 13:47
36F→:編譯器不要看不懂就好了,這部份必竟還是留給系統程式設計的09/08 13:48
37F→:人去理解才是適合的門檻,有興趣的人可以自行研究.09/08 13:49
2F→:看完 descent 大大公布輸出結果不知有何感想?09/07 23:09
5F→:此話怎說?為何會覺得我主張相矛盾?09/07 23:46
8F→:我在前面已說過,各位只是看到包裝後的結果,但實際上編譯器09/08 00:32
9F→:還是把記憶體位址儲存在指標內,如果您反駁這項理論,那就請09/08 00:33
10F→:您說說反對的理由是?09/08 00:33
14F→:我覺得做為一個學術論者,應該有本身的修養才是,而不是把精09/08 00:49
15F→:神用在無用的嘴炮上.09/08 00:50
17F→:否則只是在「原地踏步而不知為何其所然」.09/08 00:51
19F→:若有問題請以「不恥下問」的態度來學習.09/08 00:52
22F→:Feis 大大,您覺得這麼多的問題我應該先回答那一個?09/08 00:55
24F→:我覺得很奇怪的是,我只是單純的在說明一件事情,但為何會有09/08 00:57
25F→:人喜歡用放大鏡做過度的解讀以致於今天這種場面.09/08 00:58
29F推:呵呵~或許是吧.09/08 01:01
31F→:您剛問「不透過整數去定義浮點數」,這個論點是您個人?09/08 01:04
34F→:那您的問題跟想表達的事情是兩回事吧09/08 01:07
36F→:「浮點數就是整數」這句話有誰說過?09/08 01:08
37F→:第一個,您的問題答案是沒人有這種論點而且我也不知道為何您09/08 01:10
38F→:會有這個問題,第二,浮點數格式跟整數格式是不相同的.09/08 01:11
39F→:F 大,您即然否定「一定」這個定義,那您可說說指標在正常的09/08 01:13
40F→:使用下除了記憶體位址以外還能夠存什麼呢?09/08 01:14
3F→:descent 大大,我想有人還是不清楚為何結果如此這樣,請您說09/06 23:43
4F→:說有何高見吧^^09/06 23:44
10F→:F 大大,您說的指標分兩部份是指?09/07 00:17
12F→:那「浮點數也是整數」,這個好像不是我的邏輯耶^^09/07 00:18
14F→:一個一個慢慢來,一個問題未解又提另一個問題,descent 大大,09/07 00:21
15F→:您怎麼說?09/07 00:21
17F→:我該講的都講了,如果不懂的請看前面我討論過的內容,至於還09/07 00:22
18F→:是不懂為何請教 descent 大大吧^^09/07 00:23
1F→:void main(void) 的寫法是可行的唷^^08/10 00:59
2F→:雖然這個寫法較傳統,但是語法與文法都正確哦^^08/10 02:16
3F→:目前我使用的 Visual C++ 都接受 void main(void) 與08/10 20:18
4F→:int main(void),各位可以把 C++ 專案改成原生 C++ 類型來08/10 20:19
5F→:用 void main(void) 來寫發現也可通過編譯.08/10 20:21
6F→:這個就是 Visual C++ 的彈性.08/11 20:23
1F→:這個敘述 :08/31 21:36
2F→:(*(void(*)())(func_addr))();08/31 21:49
3F→:我用 Visual C++ 2008 可以正常執行.08/31 21:50
1F→:那就換您說說看您的觀點如何?08/27 23:00
5F→:那請問「指標不等同無號正整數」的觀點為何?08/27 23:16
9F→:F 大大,我說的 0 與 1 跟「正整數」是無關連的,而且我也說08/27 22:47
10F→:「它會轉呼叫輸出 BOOL 型態數值」的函式,對吧?08/27 22:47
11F→:我不知道 F 大大去扭曲我說的話的用意何在?08/27 22:48
17F→:你說我把東西都當整數,這句話就是在扭曲了.08/27 22:51
20F→:我前面說了那麼多,沒想到您還是不明白08/27 22:53
22F推:我很好奇的是,討論記憶體的問題為何要跳 Tone 到檔案上呢?08/27 22:56
25F→:這樣偏離討論主題不知道您的用意何在?08/27 22:56
26F→:那就換您說說看您的觀點如何?08/27 23:00
30F→:那請問「指標不等同無號正整數」的觀點為何?08/27 23:16
35F→:天啊!原來您的理解是在於它的「型態」,而不是它的特性...08/27 23:21
36F→:所以我在前才會說您的誤會可深了...我來從沒有說它是「無號08/27 23:22
37F→:正整數型態」,沒想到您的理解跟我的不同,我終於知道了.08/27 23:22
44F→:L 大的例子是因為他的方法用錯了,至於怎麼用請看前面記錄08/27 23:43
45F→:吧.08/27 23:44
60F→:L 大,我想您大概沒看懂這句話的意思,我說的「記憶體位址永08/28 22:05
61F→:遠都是無號整數型態」跟程式語言使用的資料型態無相關,請不08/28 22:08
62F→:要移花接木.08/28 22:08
66F→:LPH66 大大的問題很好,會問到「什麼樣子的特性」,總比某些08/29 20:21
67F→:人刻意模糊討論主題.08/29 20:22
68F→:我之前所說的「記憶體位址永遠都是無號整數型態」,是指記憶08/29 20:23
69F→:體位址「編號」的特性,例如 1 條 8 G 記憶體,它的編號會從08/29 20:25
70F→:0 ~ FFFFFFFFFFFFFFFF,這個也就是它的使用範圍,從這個數字08/29 20:28
71F→:的特性來看它就是一個無負號的「正整數」,至於作業系統要怎08/29 20:29
72F→:麼使用它完全根據作業系統特性決定實際能使用的範圍,但不管08/29 20:30
73F→:使用範圍是多少,它最終都還是一個整數而已,那些位址編號就08/29 20:31
74F→:是我們所熟知的「記憶體位址」,我們使用的指標就是儲存這種08/29 20:32
75F→:類型的資料,不管它是屬於那一種,甚至是 void*,它儲存的都是08/29 20:33
76F→:記憶體位址,各位應該常看到 16 進位的指標變數對吧?或者是08/29 20:34
77F→:前幾位網友利用「強制轉型」的方式讓編譯器用不同的型態對08/29 20:37
78F→:這個位址做不同的解讀,或甚至把它轉換成正整數型態也會發現08/29 20:39
79F→:像是 void* 轉成 int 型態,可以發現這 2 個變數內容一樣,例08/29 20:41
80F→:如 :08/29 20:41
81F→:void *pv; // 這個系統會隨意給一個值08/29 20:41
82F→:上面敘述改成這樣 :08/29 20:45
83F→:void *pv = malloc(100);08/29 20:46
84F→:int Address = (int)pv; // 把指標型態轉成整數08/29 20:47
85F→:cout << pv << endl << Addres;08/29 20:47
86F→:會發現這 2 個變數儲存的內容一模一樣,只是進位表示的方式08/29 20:48
87F→:不同,這個就是我之前在跟大家討論的觀念.08/29 20:49
89F→:s 大大,您說的是資料型態本身的大小,每一種編譯器給予不同08/29 20:54
90F→:的型態會有不同的實作方式,但「資料型態大小」不管是多少它08/29 20:56
91F→:還是只儲存記憶體位址而已,並不影響程式執行結果.08/29 20:56
93F→:azureblaze : 怎麼說呢?08/29 21:12
94F→:不然您覺得它應該還有儲存什麼呢?08/29 21:16
98F→:這樣講好了,當您輸出這個「指向成員函式的指標」,請問您看08/29 21:22
99F→:到了什麼?08/29 21:22
101F→:先不管它的資料型態多大,您只要說出螢幕上看到的.08/29 21:23
103F→:azureblaze : 那您可能沒看到前幾位網友的方法,請往前看記08/29 21:25
104F→:錄唷,那裡都有詳細的說明.08/29 21:25
106F→:F 大大,這裡純屬討論區,不是嘴炮討論區,請維持該區的品質,08/29 21:29
107F→:謝謝!08/29 21:29
111F→:您還沒告訴我您看到了什麼08/29 21:31
113F→:我先問的問題,應該是您先要回答我吧08/29 21:36
115F→:前面網友提供的方法您用過了嗎?08/29 21:53
117F→:azureblaze : 這位大大,如果您有問題,請注意您的發問態度,08/29 22:01
118F→:用這種口氣在質問不如自已找答案吧.08/29 22:03
141F→:我現在才知道原來有些人喜歡移花接木.08/30 00:12
142F→:W 大大,您如果不懂某些方面的理論可以看其他主題的文章.08/30 00:13
143F→:這裡是屬於程式設計討論區,不是嘴炮專用討論區.08/30 00:14
144F→:可以建議版主喜歡刻意去謀黑言論的人勿讓他再進來,以免破壞08/30 00:16
145F→:討論區的品質.08/30 00:16
156F→:這些問題可以去看 descent 大大發表的討論文章,裡面都有說09/04 19:45
157F→:明,不懂理論的請以「不恥下問」的態度來發問,謝謝.09/04 19:46
161F→:descent 大大的 code 我在 Visual C++ 2008 是沒問題的唷^^09/05 23:08
162F→:不過不確定其他編譯器是否有問題,不過看過了 LPH66 大大給09/05 23:09
163F→:的範例程式後發現在 Visual C++ 2008 應該是不可行,至於為09/05 23:10
164F→:什麼我想大家都知道了,如果還是不懂為何請自行發問,至於大09/05 23:13
165F→:家一直對於輸出結果倒底是什麼「數」可以去看 descent 大大09/05 23:17
166F→:使用 Visual C++ 2010 與 GCC 編譯器輸出的結果應該能推測09/05 23:18
167F→:為何輸出的結果它的「特性」會相差很大了.09/05 23:19
168F→:本人再次強調,我討論的重點是在於記憶體位址的「特性」,跟09/05 23:22
169F→:編譯器實作的技術並無直接關連,因為不管實作技術為何,CPU09/05 23:23
170F→:永遠都只使用「記憶體位址」在存取資料,各位只是看到表面上09/05 23:26
171F→:被包裝後的結果,如此而已.09/05 23:29
1F→:看來各位好像不太能理解其中的道理,各位要記得,記憶體位址08/26 20:02
2F→:永遠都是「無號數整數型態」,float 與 double 是屬於實數型08/26 20:03
5F→:記憶體位址對任何機器來說都是屬於連續的位址編號,並不會有08/26 21:24
6F→:所謂的違反問題,就好像住家地址不可能以自已的姓名代表一樣08/26 21:25
11F推:其實這個例子滿有趣的,可以試看看這個 :08/27 01:01
12F→:cout << &A::func;08/27 01:03
13F→:會發現什麼都沒有,可以思考看看為什麼會這樣.08/27 01:04
14F→:L 大大,一個大陣列的記憶體位址是不是連續的您應該知道吧?08/27 01:21
16F→:Feis : 此話怎說?08/27 01:29
20F→:L 大大,竟然您提出了問題,但您確定有思考過這個問題為什麼08/27 01:42
21F→:會發生嗎?如果不思考而直接提問想要對方自圓其說,這樣說好08/27 01:43
23F→:像不符合事實吧?08/27 01:44
24F→:如果「知其然,並不知其所然」,這是每個人的必經之路,唯有抱08/27 01:46
25F→:著一顆學習的心態才能使自已成長.08/27 01:46
27F→:在我的電腦上,如果要輸出「類別內的函式或是資料成員」的08/27 02:55
28F→:位址,有可能會看到不正確的結果,如果以啟動 Debug 模式,可08/27 02:56
29F→:以看到 p 的確是有位址資料,但輸出是 0 或是 1,顯然這個跟08/27 02:57
30F→:編譯器實作有關係,所以 p 並不是沒有資料,而是被編譯器隱藏08/27 02:58
31F→:起來不讓您看到,為什麼會這樣說呢?當編譯器遇到這個敘述 :08/27 03:00
32F→:void(A::*pv)(void) = &A::func;08/27 03:04
33F→:cout << pv; // 這個敘述無義意08/27 03:05
34F→:我用 Visual C++ 2008 編譯器對應策略是 :08/27 03:06
35F→:取得 func() 函式的位址,再來就是比對數值是否為 008/27 03:08
36F→:然後接著直接輸入數字 108/27 03:09
37F→:抱歉!是輸出數字 108/27 03:09
38F→:我的理解是 : 因為這個數字並不是 func() 函式位址,當然08/27 03:11
39F→:編譯器也就無法讓您做所謂的「強制轉型」了.08/27 03:12
46F→:我要您思考的是,為什麼遇到這個敘述即使用了「強制轉型」仍08/27 08:56
47F→:無法轉換?而不是編譯器的實作原因為何,如果今天這個 pv 是08/27 08:57
51F推:指向一般資料或是函式位址,編譯器就會做轉換?08/27 09:00
52F→:我想要說的是,L 大大問的問題本身就違反了 C++ 規則,所以08/27 09:04
53F→:編譯器的對應策略就是我上面說的那樣,我說過「語意上不可行08/27 09:06
54F→:,實作上可行」的就是這個例子,您永遠看到都只是 1 而已,對08/27 09:07
56F→:編譯器來說已實作出結果了,但這會是您想要的嗎?08/27 09:07
59F→:F 大大,難道您還不知道答案嗎?08/27 09:11
61F→:即然您要問我輸出結果不是 1 的例子,像這樣 :08/27 09:15
62F→:void(*A::pv)(void) = 0;08/27 09:16
63F→:cout << pv;08/27 09:16
64F→:不知道這樣清楚了嗎?08/27 09:16
68F→:今天這個例子來看的話,編譯器已遇到「違反 C++ 規則,原屬語08/27 09:19
71F→:意上不可行,但編譯器有內定的演算法」,所以編譯器並不會出08/27 09:21
72F→:現預期結果.08/27 09:21
74F→:這個例子是在討論「違反 C++ 規則那一條,還是無法做強制轉08/27 09:22
75F→:型的原因?」,請 F 大大不模糊焦點了.08/27 09:23
79F→:呵呵...本人並沒有「救援」的想法,只是在說明事實.08/27 09:28
83F→:為何輸出 1 我在前面已說過了,請往回看記錄唷...08/27 09:43
84F→:而且 F 大大已說到答案了,就是因為「C++ 的標準」,導致08/27 09:44
85F→:L 大大的例子無法使用強制轉型,這樣夠清楚了吧?08/27 09:45
87F推:所以現在是在「考我」?08/27 09:50
89F→:「為何不能使用強制轉型」,與「違反 C++ 規則那一條」應該08/27 09:52
90F→:是分開討論的主題吧,F 大大請不要再模糊焦點了.08/27 09:53
96F→:原 po 的問題我已說出答案了,至於 F 大大的問題,編譯器只是08/27 10:14
97F→:轉呼叫「能輸出 BOOL 型態數值」的函式,所以 CaptainH 大大08/27 10:18
98F→:您認為這樣編譯器會給您轉嗎?08/27 10:19
99F→:C++ 規則記錄的是語法的使用規則與文法的正確性,並不包含08/27 10:20
101F→:「電腦硬體規格」,記憶體位址為什麼要使用無號整數可以看08/27 10:21
102F→:我在其他討論區說明的.08/27 10:22
105F→:這個問題很有趣,因為這是編譯器遵循 C++ 規則所看到的結果.08/27 10:29
111F→:為何 &A::func 看不到函式的位址可以往前看記錄唷...08/27 10:33
112F→:我目前能理解的是,這個可能跟本身區段的分配有關係,因為對08/27 10:37
113F→:一般的資料或是函式而言,都有明確的區段所在位置,各位要知08/27 10:39
114F→:道一個完整的程式有所謂的程式區段與資料區段跟堆疊區段,那08/27 10:40
115F→:C++ class 的資料排列方式或許跟一般資料的排列大不相同,08/27 10:41
116F→:一般的函式在程式區段,變數是在資料區段,呼叫函式的過程就08/27 10:43
117F→:因為參數的傳遞方式而決定要不要使用堆疊區段,但 C++ class08/27 10:44
118F→:是屬於「資料型態」類型的變數,編譯器或許把它放在資料區段08/27 10:45
119F→:內,但因為裡面包含了函式,編譯器絕不可能把函式也放在資料08/27 10:46
120F→:內,或許在程式區段內儲存類別的成員函式,編譯器也許可能用08/27 10:47
122F→:了一個「指向程式區段」指標儲存這個函式的位址,有點類似08/27 10:50
123F→:虛擬函式的技術但不完全相同,所以應該就能理解為何 C++ 規08/27 10:55
124F→:則為何要這樣做了...這是我個人的推斷囉.08/27 10:55
132F→:看前面的記錄可以知道結果唷08/27 14:08
133F→:L 大大,您可以利用下面這個敘述 :08/27 14:11
134F→:void(A::*pv)(void) = &A::func;08/27 14:11
135F→:利用 Debug 模式觀看 pv 變數值,那個記憶體位址就是 func()08/27 14:12
136F→:函式的位址,不過因為 C++ 規格的關係,編譯器把它隱藏了,只08/27 14:13
138F→:能透過 Debug 的方法來看到,但編譯器仍完成了轉型,但結果是08/27 14:13
140F→:1,這個就是編譯器內部的演算法策略.08/27 14:14
144F推:板主所言甚是,但電腦硬體架構是一成不變的,並不會換了軟體08/27 14:18
145F→:而決定硬體的使用方式,我所說的「記憶體位址是連續的編號」08/27 14:19
146F→:是指作業系統看到的,但實際上會因為記憶體的管理而讓使用者08/27 14:20
147F→:覺得好像沒有連續,試想這樣的事情 : 宣告陣列的時候為什麼08/27 14:21
148F→:是用連續排列的方式而儲存,而不是跳著存呢?08/27 14:22
149F→:我們都知道,在 32 bit 作業系統下能存取的記憶體範圍是08/27 14:28
150F→:0 ~ FFFFFFFF,這個就是能證明記憶體位址是連續的最好例子,08/27 14:29
151F→:但有可能全部都給您程式使用嗎?當然不可能,不然作業系統就08/27 14:29
152F→:不需要做記憶體管理了,因為我們的程式大部份都是屬於在作業08/27 14:31
153F→:系統層次上運行,使用的權限與資源都被作業系統掌控,所以當08/27 14:32
154F→:然看不出來它裡面的秘密了.08/27 14:33
172F→:K 大大,我在前面說過,記憶體存取範圍會因為作業系統使用了08/27 19:55
173F→:記憶體管理而讓使用者覺得位址好像沒有連續,前面也說到不可08/27 19:57
174F→:能全部都給自已使用,0 ~ FFFFFFFF 只是一個範圍,從那裡開始08/27 19:58
175F→:是作業系統自已決定,程式設計師只能使用作業系統給的有限範08/27 19:59
176F→:圍內使用.08/27 20:00
177F→:S 大大,即然您知道位址是 Segment 與 Offset 組成,那為什麼08/27 20:18
180F→:不會覺得是正整數呢?可以請您說明一下嗎,謝謝08/27 20:19
183F→:D 大大說到重點了,各位可以想看看為什麼 printf() 函式可以08/27 20:24
184F→:看到位址?08/27 20:24
188F→:在 16 bit 下, 0100:0000 與 0000:1000 並沒有不同,因為它08/27 20:54
189F→:們都是代表同一個實體位址,也就是 16 進位絕對位址 100008/27 20:56
194F→:E 大,這個問題是屬於組合語言的部份了.08/27 21:03
195F→:這個問題可以另外討論,但我要強調的是,不管是使用那一種記08/27 21:04
196F→:憶體表示法,它們永遠都是屬於「無號正整數」,其實我還滿想08/27 21:05
197F→:看用負數的方式來表示記憶體位址呢!08/27 21:06
202F→:並非計較,只是強調觀念,而且我很好奇的是,即然存取範圍是08/27 21:19
203F→:0 ~ FFFFFFFF,那為什麼會有負數呢?08/27 21:19
204F→:難道 FFFFFFFF 可以解釋成 -1 ?08/27 21:20
205F→:而且您說的 0100:0000 與 0000:1000 位移 F000 後會不一樣,08/27 21:25
206F→:可以另外討論.08/27 21:26
2F→:其實不管用那一種寫法,編譯器只要遇到強制轉型動作的話08/23 21:27
3F→:會假設你知道目前正在做什麼事,所以編譯器不會出現錯誤而是08/23 21:28
4F→:顯示警告訊息,這個例子的 GMGID 與 MF2KGMG_operator* 都是08/23 21:30
5F→:32 bit 指標,它可以指向任何型態物件位址,遇到了強制轉型的08/23 21:33
6F→:話,編譯器仍會完成轉型動作,但結果是未知的.08/23 21:38
9F→:這裡指的是指標的強制轉型寫法不管那一種編譯器仍會完成轉08/24 21:25
10F→:型動作.08/24 21:26
11F→:要判斷指標是不是 32 bit 可以使用 sizeof(void*) 得到結果08/24 21:28
15F→:通常要刻意去寫「從語意上來看不可行,但實作上可行」的敘述08/24 23:38
16F→:屬高階程式設計技巧,要怎麼應用端看目的為何,以這個例子來08/24 23:39
18F→:看, GMGID 它是 int 型態,但實際上是 MF2KGMG_operator*08/24 23:40
20F→:用了強制轉型編譯器就有警告訊息就是一個例子.08/24 23:41
21F→:請問你的目的是?08/24 23:42
24F→:你可以注意看這個例子, *GMGID 轉成 MF2KGMG_operator 物件08/24 23:45
25F→:不就有警告訊息了嗎08/24 23:45
27F→:轉成 MF2KGMG_operator 指標編譯器會給你警告訊息08/24 23:46
32F→:GMGID 它是 int *08/24 23:54
33F→:這位大大您誤會我的意思了,我是指「利用指標變數可以指向08/24 23:55
34F→:任何型態的物件」的強制轉型.08/24 23:55
36F→:這個例子難道你看不出來有什麼變化嗎?08/25 00:01
38F→:所以才會有警告訊息的用意,這樣您懂了嗎?08/25 00:04
42F→:如果你看的出來這個例子的變化就知道我在說什麼了.08/25 00:13
43F→:看不出來的話也沒關係,因為這個是屬於「語意不可行」.08/25 00:14
47F推:感謝 L 大大提供的資料,不過還是老話一句也就是我說的,08/25 06:42
48F→:「語意上不可行,但實作上可行」的作法編譯器只會給你警告訊08/25 06:43
49F→:息,因為它假設你知道目前正在做什麼事情,強制轉型只是08/25 06:44
50F→:完成你指定的動作,那結果必定是未知的,所以也就不符合08/25 06:47
51F→:「可攜性」.08/25 06:47
70F→:F 大大,我想您誤會可深了,我說的「實作上可行」是指編譯器08/25 20:03
71F→:會完成轉換動作,但結果是未知的,可想而知結果為不確定性原08/25 20:05
72F→:因就是「雖然已完成轉換動作,但結果可能不是您要的」,即然08/25 20:08
73F→:編譯器會完成轉換對編譯器來就是「實作上可行」,但對結果來08/25 20:08
74F→:說就是「實作上不可行」,不知道這樣有清楚了嗎?08/25 20:09
79F→:指標本身是幾位元型態編譯器會依照作業系統的特性來決定,並08/25 22:12
80F→:不影響執行結果.08/25 22:13
82F→:這個例子就是使用 C 語言的方式在做「強制轉型」.08/25 22:14
84F→:如果把這個敘述 (MF2KGMG_operator *) 改成08/25 22:19
85F→:static_cast<MF2KGMG_operator *>(*GMGID);08/25 22:20
86F→:編譯器就會出現錯誤了,但相對的改成08/25 22:21
87F→:reinterpret_cast<MF2KGMG_operator *>(*GMGID);08/25 22:21
88F→:這個結果跟用 C 語言的方式相同.08/25 22:21
89F→:C 語言本身的 struct 跟 C++ 的 class 是大同小異的.08/25 22:23
102F→:看來各位好像不太能理解其中的道理,各位要記得,記憶體位址08/26 20:02
103F→:永遠都是「無號數整數型態」,float 與 double 是屬於實數型08/26 20:03
104F→:態,所以編譯器就不允許把記憶體位址轉成實數型態,其實真的08/26 20:07
105F→:不能轉嗎?當然不是,只是最後還是要透過 FPU 做實數轉整數的08/26 20:08
106F→:過程,這樣等於畫蛇添足,與其這樣不如以整數來取位址是明智08/26 20:10
107F→:選擇.08/26 20:10
110F→:F 大大,並非以管窺天,只是在講解其中理論.08/26 20:58
112F→:所以我才會說「語法上不可行,但實作上可行」.08/26 21:10
116F→:就我一直在說的「強制轉型」,這樣想好了,之所以會強制轉型08/26 21:15
117F→:是因為敘述不符合邏輯,如果不使用強制轉型,編譯器馬上會提08/26 21:16
118F→:出「型態不符合」,強制轉型只是讓編譯器知道你很清楚目前正08/26 21:17
119F→:在做什麼事情,所以編譯器仍會完成轉換,但結果是不是您要的08/26 21:18
120F→:就不得而知了.08/26 21:19
121F→:記憶體位址對任何機器來說都是屬於連續的位址編號,並不會有08/26 21:24
122F→:所謂的違反問題,就好像住家地址不可能以自已的姓名代表一樣08/26 21:25
130F→:記憶體模型只是關係到程式的活動範圍,flat 只能在 Windows08/26 23:34
131F→:的保護模式下運行,它只有一個區段,裡面保存程式區段與資料08/26 23:39
132F→:區段也包含使用的資源,它能存取的範圍可以是整部電腦實體記08/26 23:40
133F→:憶體或者是透過作業系統的虛擬記憶體來決定存取的範圍,但不08/26 23:41
134F→:論是使用那一種記憶體模型,CPU 都是使用所謂的「區段值」與08/26 23:43
135F→:「位移值」的方式來存取記憶體,CPU 本身的暫存器都只能儲存08/26 23:46
136F→:整數而已,只有一個例外就是 CPU 本身內含的 FPU 暫存器才能08/26 23:48
137F→:儲存 IEEE 浮點數,CPU 在做間接取值的時候也都是使用一般用08/26 23:50
138F→:途的暫存器,內含的都只有整數而已,各位可以試看看這個 :08/26 23:53
141F→:在命令提示字元下輸入 : debug 然後按 Enter08/26 23:54
143F→:然後按 r, 可以看到 CPU 全部的暫存器 16 進元的數值08/26 23:55
145F→:學過電腦的人都應該知道電腦本身只有 0 與 1 的數字,對吧?08/26 23:56
148F→:我剛試過, Windows 7 好像不支援 debug 指令...08/26 23:57
149F→:F 大大,您講到重點了,全部格式都是整數,所以記憶體位址也不08/27 00:01
150F→:例外不是嗎?08/27 00:01
152F→:我剛說的這些理論只是要說明為何記憶體位址是整數而不是其08/27 00:06
153F→:他非整數的表示方式,跟語言無關,必竟不管使用那一種語言最08/27 00:08
154F→:後都會轉為機器碼,如此而已.08/27 00:09
157F→:Page number 與 Page Offset 是屬於虛擬記憶體的部份,可能08/27 00:13
160F→:要另外討論了.08/27 00:13
162F→:Feis : 怎麼說呢?08/27 00:18
165F→:噗...08/27 00:21
17F推:觀察 s 的型態是 set<int> 還是 set<char*> 就能知道答案.08/19 21:21