C_and_CPP 板


LINE

開發平台(Platform): (Ex: Win10, Linux, ...) windows11 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) Visual Studio 2022 有兩個矩形 class 其中算周長的函式 一個是用一般成員函式 另一個是用靜態成員函式 但這個靜態成員函式的用法我是第一次看到 只要把物件自己的指標傳進去 靜態成員函式就可以使用 private 的一般成員變數了耶!! 連 Get 函式都可以不用 根本就跟一般成員函式一樣 C++ 程式碼如下: class Rectangle01 { private: int width; int height; public: Rectangle01(int width, int height) { this->width = width; this->height = height;} int Perimeter() { return width * 2 + height * 2;} }; class Rectangle02 { private: int width; int height; public: Rectangle02(int width, int height) { this->width = width; this->height = height;} static int Perimeter(Rectangle02 *pRec02) { return pRec02->width * 2 + pRec02->height * 2; } }; int main() { Rectangle01 *pRec01 = new Rectangle01(10, 20); cout << pRec01->Perimeter() << endl;//60 Rectangle02 *pRec02_1 = new Rectangle02(100, 200); cout << Rectangle02::Perimeter(pRec02_1) << endl;//600 Rectangle02 *pRec02_2 = new Rectangle02(200, 300); cout << Rectangle02::Perimeter(pRec02_2) << endl;//1000 delete pRec01; delete pRec02_1; delete pRec02_2; system("pause"); return 0; } 我知道靜態成員函式只能存取靜態成員變數 不需要 new 出物件也能被呼叫 所以不能用 this 也不能存取一般成員變數 講到靜態成員函式 查資料都說是都說是獨立於物件之外配置的記憶體空間 不管 new 出幾個物件 都是「使用同一個記憶體空間」 也就說靜態成員函式比一般成員函式省空間(嗎?) 另外我也測量過執行時間 迴圈1千萬次執行 new、呼叫 Perimeter 函式、delete 程式各執行10次的平均值 Rectangle01 是 2607.129 ms Rectangle02 是 2709.032 ms 沒有差很多 問題一 時間上沒有差很多 但如果真能省空間 把所有的一般成員函式通通改成靜態的 超省空間的是不是!! 講得我都想買了 那為什麼沒看見有人這樣做呢? 是會有其他什麼潛在的問題嗎? 問題二 前面提過 靜態成員函式是獨立於物件之外配置的記憶體空間 不管 new 出幾個物件 都是「使用同一個記憶體空間」 所以真的會比一般成員函式省空間嗎? 要怎麼看出物件占多少空間這件事? 先說我自己是沒有這樣用過 只是研究 static 的時候發現了這種用法 所以來請問大家的看法 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.76.138.36 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1641557720.A.DF9.html
1F:→ nh60211as: 你省了什麼空間,兩個class都要存長寬變數 01/07 20:32
2F:→ happykaka: 我就是不知道啊,物件的函式到底是怎樣配置和執行的, 01/07 21:51
3F:→ happykaka: 一般成員函式和靜態成員函式的配置和執行方式又是差在 01/07 21:51
4F:→ happykaka: 裡?我找到的都是變數的,找不太到函式方面的資料。 01/07 21:52
5F:推 lycantrope: 我以為物件函式是放在type,並不會跟著物件本身吧 01/07 22:08
6F:→ stucode: 一般成員函式(無論靜態與否)都是不佔物件空間的。 01/07 22:15
7F:→ stucode: virtual function 例外。 01/07 22:15
8F:推 ko27tye: 省空間是在static修飾成員變數的狀況吧 舉例來說100個丈 01/07 23:53
9F:→ ko27tye: 夫共用一個老婆 很省空間阿 01/07 23:53
10F:→ yesiah: 沒有省空間,static member function 跟 friend function 01/08 00:24
11F:→ yesiah: 功能上差不多,最大差別是 static 定義在 class 內,另一 01/08 00:24
12F:→ yesiah: 個隨便你放 01/08 00:24
13F:→ yesiah: https://stackoverflow.com/a/2315166 01/08 00:26
14F:推 CoNsTaR: 一般 member function 和 static 的差別就是一般 member 01/08 04:47
15F:→ CoNsTaR: function 有一個隱含的 this 參數啊 01/08 04:47
16F:→ CoNsTaR: 你用 static 然後又傳 this 進去,那直接去寫 C 不就好了 01/08 04:47
17F:→ CoNsTaR: orz 01/08 04:47
18F:推 Dracarys: 看到一半 跟樓上想的一樣 01/08 07:18
19F:→ Lipraxde: 有時候看到 C++ 中怪怪的用法,都不太能確定是真的怪還 01/08 11:58
20F:→ Lipraxde: 是是自己孤陋寡聞沒見過的 design pattern XD 01/08 11:58
21F:→ happykaka: 請問 CoNsTaR版友 說的「直接去寫 C」是為什麼呢? 01/08 12:44
22F:→ happykaka: 回 Lipraxde,我很確定是真的怪,所以我想知道怪在哪裡 01/08 12:44
23F:推 b0920075: C++的語法背後就是幫你弄好好讓你方便用,結果你用更麻 01/08 17:51
24F:→ b0920075: 煩的方法去做一樣的事情還沒啥好處 01/08 17:51
25F:→ happykaka: 所以靜態會省空間是指靜態變數,靜態函式沒差。把一般 01/08 23:06
26F:→ happykaka: 成員函式就可以做的事,用靜態成員函式來繞路,沒有任 01/08 23:06
27F:→ happykaka: 何好處,因此不建議這樣使用,是嗎? 01/08 23:07
28F:推 sarafciel: C++有sizeof可以看某個型態占的空間大小 你可以試試看 01/09 19:55
29F:→ sarafciel: 用靜態函式跟一般成員函式有沒有差XD 01/09 19:55
30F:→ happykaka: 2個類別的size都是8,因為都是2個int,所以類別裡的 01/10 00:04
31F:→ happykaka: 函式確實不佔空間,是這樣嗎? 01/10 00:05
32F:→ sarafciel: 簡單講 函式占空間 但函式不在類別的Instance裡佔 01/10 01:51
33F:→ sarafciel: 關鍵字memory layout 可以去查一下 01/10 01:52
34F:推 TRFgee: C++的精髓就在模組化 01/10 16:02
35F:→ TRFgee: 怎麼有人在那邊 01/10 16:02
36F:→ TRFgee: 土法煉鋼佔空間啊 01/10 16:02
37F:推 Dracarys: 佔空間是只有instructions佔空間,這各種function都是 01/10 21:31
38F:→ Dracarys: 一樣的。instance裡當然不佔空間 所有call的位址都可以 01/10 21:31
39F:→ Dracarys: 被statically resolved何須在instance裡佔空間?又不是 01/10 21:31
40F:→ Dracarys: runtime polymorphism。D&E: What you don’t use, yo 01/10 21:31
41F:→ Dracarys: u don’t pay for. 01/10 21:31
42F:推 Dracarys: 其實你可以把member function當一般free function加上 01/10 22:13
43F:→ Dracarys: 隱含this參數,static member function就像一般free fu 01/10 22:13
44F:→ Dracarys: nction,只不過一般free function要access非public dat 01/10 22:13
45F:→ Dracarys: a編譯器不會給過,雖然還是可在runtime存取。 01/10 22:13
46F:推 Dracarys: https://godbolt.org/z/xYMhqo314 用ToT clang玩一下, 01/10 23:05
47F:→ Dracarys: 不開優化,三個Perimeter的code邏輯上都一樣,call sit 01/10 23:05
48F:→ Dracarys: e也都會把this當第一個argument傳入rdi。 01/10 23:05
49F:→ Dracarys: 看你這麼愛玩this應該對這有興趣 01/10 23:07
50F:→ Dracarys: https://youtu.be/caXxUi_lyks 01/10 23:07
51F:→ Dracarys: https://wg21.link/p0847 01/10 23:07







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP