Board logo

標題: C++ 既 pointer 其實有咩用 (新手問題) [打印本頁]

作者: peterchu1    時間: 2013-4-3 17:37     標題: C++ 既 pointer 其實有咩用 (新手問題)

請問 C++ 既 pointer 係 point 左去邊 ? 係想去另一個 function / address  定其他地方 ?
thanks
作者: DarkHero    時間: 2013-4-3 21:15

唔識google?
作者: faiwaic    時間: 2013-4-3 23:15

省 memory 同快既問題...
作者: KoolFreeze    時間: 2013-4-3 23:53

無左pointer Binary Tree都寫唔到...
作者: peterchu1    時間: 2013-4-3 23:56

省 memory 同快既問題...
faiwaic 發表於 2013-4-3 23:15



    其實點樣可以做到省 memory ?
作者: KinChungE    時間: 2013-4-4 00:06

其實點樣可以做到省 memory ?
peterchu1 發表於 2013-4-3 23:56


pass by pointer/pass by reference都可以避免平時call function時pass by value要將整個data copy
作者: faiwaic    時間: 2013-4-4 00:19

無左pointer Binary Tree都寫唔到...
KoolFreeze 發表於 2013-4-3 23:53



    Binary Tree 既話, Java 同 VB 冇 pointer 都做到...
係煩少少
作者: 燕飛    時間: 2013-4-4 00:23

回復 6# KinChungE


    pointer len = 4/8 bytes (depend on system)
作者: KoolFreeze    時間: 2013-4-4 00:31

Binary Tree 既話, Java 同 VB 冇 pointer 都做到...
係煩少少
faiwaic 發表於 2013-4-4 00:19


與其話Java無pointer,不如話Java所有野都係pointer
作者: LoneGumMan    時間: 2013-4-4 01:10

Binary Tree 既話, Java 同 VB 冇 pointer 都做到...
係煩少少
faiwaic 發表於 2013-4-4 00:19
你估java裏面果個 NullPointerException 個名點黎架呢?
Java / .Net 裏面所謂O既reference, functionally 同pointer冇分別.
作者: LoneGumMan    時間: 2013-4-4 01:12

省 memory 同快既問題...
faiwaic 發表於 2013-4-3 23:15
POINTER 要表達O既野跟本係同intrinsic value 唔同一個CLASS.同省MEMORY 或者速度完全冇關.
作者: LoneGumMan    時間: 2013-4-4 01:44

本帖最後由 LoneGumMan 於 2013-4-4 01:47 編輯
請問 C++ 既 pointer 係 point 左去邊 ? 係想去另一個 function / address  定其他地方 ?
thanks ...
peterchu1 發表於 2013-4-3 17:37
其實冇話"point 左去邊". 首先你要理解O既係乜野叫做 variable.

(以下例子暫時放開 stack vs heap allocation 唔理住)

用一個傳統O既例子. 你可以想像你個PROGRAM O既MEMORY SPACE 係一堆locker , 好似公眾泳池果D. 每當你 declare 一個 variable, 你可以想像你要用一個或以上O既locker去放野(視乎你要放幾多, char / bool 最細, 一格就得, short 大D, 兩格, int 四格,etc). 假設locker 係 2D grid, 好似EXCEL 咁可以 A11, B23 咁去reference, 咁個 char 就可能係放響 A13, 個 int variable 可能係 D11,D12,D13,D14

char c = 'x'; // c o既address 係 A13
int i = 12345; // i o既address 係 D11 - 14

一個pointer variable 就係一個儲住個 Address o既 variable.

char* cp = &c;  // cp = A13
int* ip = &i; // ip = D11

當你用一個 int pointer o既時候, compiler 知道 int 係 4 格咁大 (佢知道所有 type O既 exact size), 所以當你 de-reference 一個 int pointer o既時候, 佢就會識得讀番 D11 - 14 俾你;

char c2 = *cp;  // c2 = 'x'
int i2 = *ip;  // i2 = 12345

有師兄提到pass-by-value / pass-by-reference, 順帶解釋埋. 響 C / C++ 裏面, 當你 call function o既時候, parameter default 係pass-by-value o既, 即係compiler 會gen code 幫你做一個copy俾function 用. 大部份時候咁樣都OK, 但係如果你想個function幫你改個 variable o既value 又點呢? 唔WORK, 因為佢可以改到o既只係一個COPY.

簡單例子 (少少syntax錯,唔理):
  1. void func (int yy) {
  2.    yy = yy + 1;
  3. }
  4. ....
  5. int main () {
  6.     int yy = 10;
  7.     func ( yy );
  8.     cout << "yy = " << yy << endl;
  9. }
複製代碼
當你最後 print yy o既時候, 出黎仍然係 10, 因為function 改果個係個 "copy of caller's yy".

要人地改到你O既value, 最簡單就係話俾人知個locker (memory location!) 等人地直接寫:
  1. void func (int* yy) {
  2.    *yy = *yy + 1;
  3. }
  4. ....
  5. int main () {
  6.     int yy = 10;
  7.     func ( &yy );
  8.     cout << "yy = " << yy << endl;
  9. }
複製代碼
今次, yy 係11, 因為人地知道真正O既memory address, 可以de-reference去改.

以上O既寫法係 C. C++ 可以有一個靚仔D O既寫法, reference
  1. void func (int& xx) {
  2.    xx = xx + 1;
  3. }
  4. ....
  5. int main () {
  6.     int yy = 10;
  7.     func ( yy );
  8.     cout << "yy = " << yy << endl;
  9. }
複製代碼
今次冇晒D 星星, 因為 xx 係一個"reference to int", 可以諗成為一個 "代號" (我唔知中文書叫佢做乜野 :p) compiler 知道 "xx" 其實即係 caller o既 yy;  如果你改 xx 即係直接改 yy

仲有其他 const reference 之類O既野, 你慢慢睇下會明
作者: bobby_chan    時間: 2013-4-4 10:42

其實冇話"point 左去邊". 首先你要理解O既係乜野叫做 variable.

(以下例子暫時放開 stack vs heap allocat ...
LoneGumMan 發表於 2013-4-4 01:44

解釋得好好!
其實pointer最難係以下幾個問題:
1)pointer同array關係
2)pointer同String關係
3)pointer同"動態記憶體配置"的關係
作者: DarkHero    時間: 2013-4-4 12:51

其實pointer 搞到咁難用咁樣
點解唔做返要自己copy 份新出黎,而default 用左pass by value
有無人知當初點解要咁樣設計?
作者: Jackass_TMxCK    時間: 2013-4-4 16:45

Binary Tree 既話, Java 同 VB 冇 pointer 都做到...
係煩少少
faiwaic 發表於 4/4/2013 12:19 AM



    係唔洗explicitly 咁declare ,所有用new operator做ge object都係pointer黎


各兄弟,唔好再話Java, JS, AS無pointer唔該
作者: Jackass_TMxCK    時間: 2013-4-4 16:47

其實pointer 搞到咁難用咁樣
點解唔做返要自己copy 份新出黎,而default 用左pass by value
有無人知當初 ...
DarkHero 發表於 4/4/2013 12:51 PM



    你咁樣樣就大鑊啦,個個object唔同size,下下都copy個program會行好耐,又要用好多好多位


stack overflow你就死得
作者: DarkHero    時間: 2013-4-4 16:56

你咁樣樣就大鑊啦,個個object唔同size,下下都copy個program會行好耐,又要用好多好多位


stack o ...
Jackass_TMxCK 發表於 2013-4-4 16:47

我咪話如果有需要咪自己copy 囉
作者: Jackass_TMxCK    時間: 2013-4-4 16:59

我咪話如果有需要咪自己copy 囉
DarkHero 發表於 4/4/2013 04:56 PM



    咩叫有需要要自己copy,行親function都會要用各式各樣ge object,下下都copy?我係講緊呢個問題

如果係自己個function以內用ge object,你鐘意點無所謂。最大問題係你唔係咩都寫曬係同一個function度,d野要pass黎pass去
作者: KinChungE    時間: 2013-4-4 16:59

我咪話如果有需要咪自己copy 囉
DarkHero 發表於 2013-4-4 16:56


Java咪已經係咁
作者: snoopy11hk    時間: 2013-4-4 17:40

Java咪已經係咁
KinChungE 發表於 2013-4-4 16:59



    但係好奇一問, 點解 Java 仲係慢過 C++?
作者: KinChungE    時間: 2013-4-4 17:56

但係好奇一問, 點解 Java 仲係慢過 C++?
snoopy11hk 發表於 2013-4-4 17:40


因為Java唔係run native code, 要行VM
作者: snoopy11hk    時間: 2013-4-4 18:11

因為Java唔係run native code, 要行VM
KinChungE 發表於 2013-4-4 17:56



    問錯野, 應該係:點解 Java 食 RAM 過 C++ 咁多
如果話 Java 係有用 Pointer, 應該可以同 C++ 等同咁濟, 但點解事實又唔係呢?
Android 而家 D 機都用緊 2GB RAM, Windows 2GB ram 行得好smooth 下, 但 Android 都話唔夠 RAM?
作者: KinChungE    時間: 2013-4-4 18:23

問錯野, 應該係:點解 Java 食 RAM 過 C++ 咁多
如果話 Java 係有用 Pointer, 應該可以同 C++ 等同咁 ...
snoopy11hk 發表於 2013-4-4 18:11


因為行VM
作者: Jackass_TMxCK    時間: 2013-4-4 18:59

問錯野, 應該係:點解 Java 食 RAM 過 C++ 咁多
如果話 Java 係有用 Pointer, 應該可以同 C++ 等同咁 ...
snoopy11hk 發表於 4/4/2013 06:11 PM



    Java同Flash/Air都係行虛擬程式,virtual machine黎行
作者: faiwaic    時間: 2013-4-4 22:34

你估java裏面果個 NullPointerException 個名點黎架呢?
Java / .Net 裏面所謂O既reference, functi ...
LoneGumMan 發表於 2013-4-4 01:10



    雖然 我唔係太了解java, 但 .Net support C 既 function, 而 C 有pointer 的
作者: LoneGumMan    時間: 2013-4-4 23:55

本帖最後由 LoneGumMan 於 2013-4-5 00:01 編輯

.Net CLR 設計O既其中一個criteria係可以同native platform interop. Java 都有 JNI.

因為C 基本上有一個全世界都理解同埋同意左O既 calling convention, call native code 唔係咁大不了. 只要 GEN 到o岩O既function setup, jmp 到O岩O既address, 下一個 instruction 就係native code, return 返黎, 睇得明個 memory layout, 恭喜晒, 你 call 左native function!

要記住一樣野, pointer 真係唔係咁大不了, 佢只係一個 address. pointer to pointer, pointer to pointer to pointer ... etc 說穿了其實都係同一個mechanism,只不過多左 n 咁多個 level of indirection. 仲有function pointer, memory function pointer ... 唔好俾佢地嚇怕.
作者: LoneGumMan    時間: 2013-4-5 00:00

其實pointer 搞到咁難用咁樣
點解唔做返要自己copy 份新出黎,而default 用左pass by value
有無人知當初 ...
DarkHero 發表於 2013-4-4 12:51
當你要落到 bare metal, 就一定要掂到 memory 同address.

memory address to an integer, memory address of memory address to an integer .. 好長, pointer to integer, pointer of pointer to integer 易讀D :) 同埋, 當你響黑板度畫公仔O既時候, pointer 一定係畫箭咀, 所以叫做pointer囉.
作者: snoopy11hk    時間: 2013-4-5 00:05

當你要落到 bare metal, 就一定要掂到 memory 同address.

memory address to an integer, memory address  ...
LoneGumMan 發表於 2013-4-5 00:00



    其實 pointer 好易, 只要你習慣左就咩問題都無
作者: LoneGumMan    時間: 2013-4-5 00:07

雖然 我唔係太了解java, 但 .Net support C 既 function, 而 C 有pointer 的  ...
faiwaic 發表於 2013-4-4 22:34
如果你睇番JAVA o既歷史, 你會發現其實而家叫O既所謂"reference" 原本係就咁叫做POINTER, 因為佢根本就係一個POINTER :) 到後來, 因為 VM implementation 令到佢同一般POINTER 有D 唔同, 為左唔好令人誤會, 所以改名 (同埋marketing..sun 想人地覺得佢好似先進D)
作者: g2david    時間: 2013-4-5 00:11

Pointer 由Assembler 開始, Pascel, 到C, C++ 全部都有. 因為初學者學習Pointer時面對困難, 簡化為Reference 同Garbage Collection.

你有意識去學是很好. 未來可能己是low level stuff.
作者: LoneGumMan    時間: 2013-4-5 00:19

因為行VM
KinChungE 發表於 2013-4-4 18:23
唔多係 :)

java/.net 唔係永遠都做interpretation o既, 去到某一個位就會 JIT; 響N 年前, JIT 基本上已經同 NATIVE 差唔多快, 有D BENCHMARK 甚至響某D 情況下快D.

Java 唔快O既原因有幾個主要O既, 其中一個係 virtual function call. java 所有野default 都係 virtual , 即係每個 function call 都要做一次type check 同vtable lookup. C++ 如果 virtual function call 都係幾多 overhead 的. 有D researcher 試過寫過D compiler加 VM, 折晒D TYPE, 冇晒virtual call, 快好多.
作者: KinChungE    時間: 2013-4-5 00:25

唔多係 :)

java/.net 唔係永遠都做interpretation o既, 去到某一個位就會 JIT; 響N 年前, JIT 基本上已經 ...
LoneGumMan 發表於 2013-4-5 00:19


即係慢既原因係dynamic binding?
作者: kuro_sora    時間: 2013-4-5 00:26

提示: 作者被禁止或刪除 內容自動屏蔽
作者: LoneGumMan    時間: 2013-4-5 00:39

即係慢既原因係dynamic binding?
KinChungE 發表於 2013-4-5 00:25
當然, interpreter 本身當然有overhead, 但係唔係太大, 尤其當D code JIT 左之後.virtual call o既OVERHEAD 相對幾大架真係, 你每call 一個 function 都要做一大堆野, 個interpreter要做 bookkeeping.

試諗下, 其實直接compile xxx.java 去一個object file (所謂O既native code) 中間都一定有intermediate representation. java / .net 只不過係停左響呢度, 下一個step runtime o既時候先做, 一 compile 左, 咪就係native 囉.

慢有N 咁多個理由喇, 呢度少少果度少少加埋就唔少. JIT 而家基本上已經可以做到 native o既 9x % .. 其實係超級 impressive.
作者: KinChungE    時間: 2013-4-5 00:49

當然, interpreter 本身當然有overhead, 但係唔係太大, 尤其當D code JIT 左之後.virtual call o既OVERHEA ...
LoneGumMan 發表於 2013-4-5 00:39


換言之, 所有野寫哂落同一個class就會快好多
不過program一大舊就唔得掂
作者: LoneGumMan    時間: 2013-4-5 00:55

換言之, 所有野寫哂落同一個class就會快好多
不過program一大舊就唔得掂 ...
KinChungE 發表於 2013-4-5 00:49
據聞如果你 declare 一個 java class "final", 個compiler可以做到 optimization.

同埋, 我頭先所講O既9x%.. 係指 computational performance. 唔係一個大program overall performance
作者: lmnwan    時間: 2013-4-5 01:29

回復 9# KoolFreeze

Agree!!!
作者: lmnwan    時間: 2013-4-5 01:43

pointer指d乜?
指function 有function pointer...http://openhome.cc/Gossip/CppGossip/FunctionPointer.html
作者: henrywho    時間: 2013-4-5 08:21

無左pointer Binary Tree都寫唔到...
KoolFreeze 發表於 2013-4-3 23:53


學 java 有一份 assignment 就係用 class 寫 binary tree
作者: KoolFreeze    時間: 2013-4-5 15:12     標題: RE: C++ 既 pointer 其實有咩用 (新手問題)

學 java 有一份 assignment 就係用 class 寫 binary tree
henrywho 發表於 2013-4-5 08:21


所以咪話java全部野都係pointer囉……
作者: henrywho    時間: 2013-4-5 17:53

所以咪話java全部野都係pointer囉……
KoolFreeze 發表於 2013-4-5 15:12


The true wonder of C pointer is pointer arithmetic.  We cannot do it in Java.
作者: yankeelam    時間: 2013-4-5 20:56

因為成個OS最慢就係I/O(even memory level)...下下pass by value, 係d complex /sensitive d 既process o ...
kuro_sora 發表於 2013-4-5 00:26


其實我現在用的電話都係得 512 MB RAM,我都想 d developer 寫 d program 可以用少 d ram。
作者: KoolFreeze    時間: 2013-4-5 22:39

The true wonder of C pointer is pointer arithmetic.  We cannot do it in Java.
henrywho 發表於 2013-4-5 17:53


I don't think pointer arithmetic is that special, as its effect can generally be easily expressed in other ways. What special is the ability to create pointer to pointer (to pointer to pointer to pointer.....)
作者: snoopy11hk    時間: 2013-4-5 22:59

I don't think pointer arithmetic is that special, as its effect can generally be easily expressed  ...
KoolFreeze 發表於 2013-4-5 22:39



    pointer arithmetic allows buffer overflow
作者: henrywho    時間: 2013-4-5 23:05

I don't think pointer arithmetic is that special, as its effect can generally be easily expressed in other ways.
KoolFreeze 發表於 2013-4-5 22:39


No, you can express it in other ways, but you cannot reproduce the speed.





歡迎光臨 電腦領域 HKEPC Hardware (https://h2.hkepc.com/forum/) Powered by Discuz! 7.2