→ Quezacot:你一定要用這麼多專有名詞嗎?-.- 推 61.224.130.41 12/13
> -------------------------------------------------------------------------- <
作者: Upsha (Marin hardtail好棒) 看板: ck54th329
標題: Re: =和ctor賦值的差異
時間: Fri Dec 13 23:01:40 2002
※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: ※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: : 用 = 的時候 你是先call ctor製造出一個object
: : 再call operator = 做賦值
: : 由於ctor和oeprator都是func
: : 所以這要兩個func stake call
: : 比起只用一個func call的ctor賦值(就是像int a(1); 這樣)
: : 多花了一個stake call的時間
: : 這裡要解釋一下stake的意思 這種資料結構定義的操作行為是
: : 先進後出 這不就是func的情形嘛!
: : 所以system要用stake管理func的call來call去
: : 管理這個資料結構就是需要效率成本的啦 (畢竟是間接啊)
: 永任說不是很了 所以我在這寫個虛擬碼看看會不會比較了
: class ptr_stake {
: private:
: func_ptr ptr_array[40];
: int size(0);
: public:
: void pop(void) { return ptr_array[size--]; }
: void push(func_ptr input) { ptrarray[++size] = input; }
: };
: 所以
: my_class a = 1;
: system會展開成
: a.myclass();
: a.operator=(1);
: 這其中 系統還要負擔
: ptrstake program_stake;
: program_stake.push(a.myclass);
: program_stake.pop(a.myclass);
: program_stake.push(a.operator=);
: program_stkae.pop(a.operator=);
: 其實這個有關stake的虛擬碼寫的很不好...@@ 其實在實作上並不是這樣
: 不過這要懂組語才好說 不過大概可以知道了吧 stake是另外一個很大的成本
: 這裡會發現我的stake難道不用func stake call嗎(我還是用的member func)
: 其實在組語層面 有一種更粗糙、基本的stake可以用
: 不過說了大概也不懂 又要打很多字
: 雖然這樣的虛擬碼不是很好 不過至少表現出來func call是很費成本的
: 大概就醬啦
簡而言之啦 就是 因為func call要成本(先不管那是什麼)
所以
可以用一個func call做的好的事 為什麼要用兩個哪?!
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: 218.160.18.163
> -------------------------------------------------------------------------- <
作者: Upsha (Marin hardtail好棒) 看板: ck54th329
標題: Re: =和ctor賦值的差異
時間: Fri Dec 13 23:33:11 2002
※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: ※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: : 永任說不是很了 所以我在這寫個虛擬碼看看會不會比較了
: : class ptr_stake {
: : private:
: : func_ptr ptr_array[40];
: : int size(0);
: : public:
: : void pop(void) { return ptr_array[size--]; }
: : void push(func_ptr input) { ptrarray[++size] = input; }
: : };
: : 所以
: : my_class a = 1;
: : system會展開成
: : a.myclass();
: : a.operator=(1);
: : 這其中 系統還要負擔
: : ptrstake program_stake;
: : program_stake.push(a.myclass);
: : program_stake.pop(a.myclass);
: : program_stake.push(a.operator=);
: : program_stkae.pop(a.operator=);
: : 其實這個有關stake的虛擬碼寫的很不好...@@ 其實在實作上並不是這樣
: : 不過這要懂組語才好說 不過大概可以知道了吧 stake是另外一個很大的成本
: : 這裡會發現我的stake難道不用func stake call嗎(我還是用的member func)
: : 其實在組語層面 有一種更粗糙、基本的stake可以用
: : 不過說了大概也不懂 又要打很多字
: : 雖然這樣的虛擬碼不是很好 不過至少表現出來func call是很費成本的
: : 大概就醬啦
: 簡而言之啦 就是 因為func call要成本(先不管那是什麼)
: 所以
: 可以用一個func call做的好的事 為什麼要用兩個哪?!
也就是int a(1);
實際上是a.int(1);
只用了一個func call
而
int a = 1;
實際上是
a.int();
a.operator=(1);
用了兩個func call
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: 218.160.18.163
> -------------------------------------------------------------------------- <
作者: Upsha (Marin hardtail好棒) 看板: ck54th329
標題: Re: =和ctor賦值的差異
時間: Fri Dec 13 23:47:46 2002
※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: ※ 引述《Quezacot (我還能裝多久?)》之銘言:
: 大致上 是的
: 更詳細點的是
: : 所以說
: : int a (1);
: : 是開一個空間,存入1,叫做a
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in one func
: : 而
: : int a = 1;
: : 是開一個空間叫做a,再存入1
: ^^^^^^^^^^^^^func 1^^^^^^func 2
: : 是醬子嗎?
為什麼c++定義的class沒差呢!
因為 他知道在operator=裡面 只會有賦值的動作
誰知道programmer會不會在裡面做奇怪的事 譬如說 一些物件管理
(不要懷疑 這常有滴)
所以 要養成用ctor賦值的好習慣啊
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: 218.160.18.163
> -------------------------------------------------------------------------- <
作者: Upsha (Marin hardtail好棒) 看板: ck54th329
標題: Re: =和ctor賦值的差異
時間: Sat Dec 14 00:02:48 2002
※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: ※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: : 大致上 是的
: : 更詳細點的是
: : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ in one func
: : ^^^^^^^^^^^^^func 1^^^^^^func 2
: 為什麼c++定義的class沒差呢!
: 因為 他知道在operator=裡面 只會有賦值的動作
: 誰知道programmer會不會在裡面做奇怪的事 譬如說 一些物件管理
: (不要懷疑 這常有滴)
: 所以 要養成用ctor賦值的好習慣啊
我太急了 說的明白點
面對內建型別的時候 系統可以預設
int a(1); 和 int a = 1;做的是一樣的事
但是c++既然允許使用者寫自己的operator= 就等於不再保證上面的情形成立了
所以就一定要兩個func call 不能性內建型別一樣預設操作行為適宜一樣的
而將後者寫為前者
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: 218.160.18.163
用 = 的時候 你是先call ctor製造出一個object
再call operator = 做賦值
由於ctor和oeprator都是func
所以這要兩個func stake call
比起只用一個func call的ctor賦值(就是像int a(1); 這樣)
多花了一個stake call的時間
這裡要解釋一下stake的意思 這種資料結構定義的操作行為是
先進後出 這不就是func的情形嘛!
所以system要用stake管理func的call來call去
管理這個資料結構就是需要效率成本的啦 (畢竟是間接啊)
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: 218.160.5.212
> -------------------------------------------------------------------------- <
作者: Upsha (Marin hardtail好棒) 看板: ck54th329
標題: Re: =和ctor賦值的差異
時間: Fri Dec 13 21:55:20 2002
※ 引述《Upsha (Marin hardtail好棒)》之銘言:
: 用 = 的時候 你是先call ctor製造出一個object
: 再call operator = 做賦值
: 由於ctor和oeprator都是func
: 所以這要兩個func stake call
: 比起只用一個func call的ctor賦值(就是像int a(1); 這樣)
: 多花了一個stake call的時間
: 這裡要解釋一下stake的意思 這種資料結構定義的操作行為是
: 先進後出 這不就是func的情形嘛!
: 所以system要用stake管理func的call來call去
: 管理這個資料結構就是需要效率成本的啦 (畢竟是間接啊)
永任說不是很了 所以我在這寫個虛擬碼看看會不會比較了
class ptr_stake {
private:
func_ptr ptr_array[40];
int size(0);
public:
void pop(void) { return ptr_array[size--]; }
void push(func_ptr input) { ptrarray[++size] = input; }
};
所以
my_class a = 1;
system會展開成
a.myclass();
a.operator=(1);
這其中 系統還要負擔
ptrstake program_stake;
program_stake.push(a.myclass);
program_stake.pop(a.myclass);
program_stake.push(a.operator=);
program_stkae.pop(a.operator=);
其實這個有關stake的虛擬碼寫的很不好...@@ 其實在實作上並不是這樣
不過這要懂組語才好說 不過大概可以知道了吧 stake是另外一個很大的成本
這裡會發現我的stake難道不用func stake call嗎(我還是用的member func)
其實在組語層面 有一種更粗糙、基本的stake可以用
不過說了大概也不懂 又要打很多字
雖然這樣的虛擬碼不是很好 不過至少表現出來func call是很費成本的
大概就醬啦
--
※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: 218.160.5.212