[問題] 關於 static member function 的問題

看板C_and_CPP (C/C++)作者 (快樂卡卡)時間3年前 (2022/01/07 20:15), 編輯推噓10(10041)
留言51則, 12人參與, 2年前最新討論串1/1
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1641557720.A.DF9.html

01/07 20:32, 3年前 , 1F
你省了什麼空間,兩個class都要存長寬變數
01/07 20:32, 1F

01/07 21:51, 3年前 , 2F
我就是不知道啊,物件的函式到底是怎樣配置和執行的,
01/07 21:51, 2F

01/07 21:51, 3年前 , 3F
一般成員函式和靜態成員函式的配置和執行方式又是差在
01/07 21:51, 3F

01/07 21:52, 3年前 , 4F
裡?我找到的都是變數的,找不太到函式方面的資料。
01/07 21:52, 4F

01/07 22:08, 3年前 , 5F
我以為物件函式是放在type,並不會跟著物件本身吧
01/07 22:08, 5F

01/07 22:15, 3年前 , 6F
一般成員函式(無論靜態與否)都是不佔物件空間的。
01/07 22:15, 6F

01/07 22:15, 3年前 , 7F
virtual function 例外。
01/07 22:15, 7F

01/07 23:53, 3年前 , 8F
省空間是在static修飾成員變數的狀況吧 舉例來說100個丈
01/07 23:53, 8F

01/07 23:53, 3年前 , 9F
夫共用一個老婆 很省空間阿
01/07 23:53, 9F

01/08 00:24, 3年前 , 10F
沒有省空間,static member function 跟 friend function
01/08 00:24, 10F

01/08 00:24, 3年前 , 11F
功能上差不多,最大差別是 static 定義在 class 內,另一
01/08 00:24, 11F

01/08 00:24, 3年前 , 12F
個隨便你放
01/08 00:24, 12F

01/08 00:26, 3年前 , 13F

01/08 04:47, 2年前 , 14F
一般 member function 和 static 的差別就是一般 member
01/08 04:47, 14F

01/08 04:47, 2年前 , 15F
function 有一個隱含的 this 參數啊
01/08 04:47, 15F

01/08 04:47, 2年前 , 16F
你用 static 然後又傳 this 進去,那直接去寫 C 不就好了
01/08 04:47, 16F

01/08 04:47, 2年前 , 17F
orz
01/08 04:47, 17F

01/08 07:18, 2年前 , 18F
看到一半 跟樓上想的一樣
01/08 07:18, 18F

01/08 11:58, 2年前 , 19F
有時候看到 C++ 中怪怪的用法,都不太能確定是真的怪還
01/08 11:58, 19F

01/08 11:58, 2年前 , 20F
是是自己孤陋寡聞沒見過的 design pattern XD
01/08 11:58, 20F

01/08 12:44, 2年前 , 21F
請問 CoNsTaR版友 說的「直接去寫 C」是為什麼呢?
01/08 12:44, 21F

01/08 12:44, 2年前 , 22F
回 Lipraxde,我很確定是真的怪,所以我想知道怪在哪裡
01/08 12:44, 22F

01/08 17:51, 2年前 , 23F
C++的語法背後就是幫你弄好好讓你方便用,結果你用更麻
01/08 17:51, 23F

01/08 17:51, 2年前 , 24F
煩的方法去做一樣的事情還沒啥好處
01/08 17:51, 24F

01/08 23:06, 2年前 , 25F
所以靜態會省空間是指靜態變數,靜態函式沒差。把一般
01/08 23:06, 25F

01/08 23:06, 2年前 , 26F
成員函式就可以做的事,用靜態成員函式來繞路,沒有任
01/08 23:06, 26F

01/08 23:07, 2年前 , 27F
何好處,因此不建議這樣使用,是嗎?
01/08 23:07, 27F

01/09 19:55, 2年前 , 28F
C++有sizeof可以看某個型態占的空間大小 你可以試試看
01/09 19:55, 28F

01/09 19:55, 2年前 , 29F
用靜態函式跟一般成員函式有沒有差XD
01/09 19:55, 29F

01/10 00:04, 2年前 , 30F
2個類別的size都是8,因為都是2個int,所以類別裡的
01/10 00:04, 30F

01/10 00:05, 2年前 , 31F
函式確實不佔空間,是這樣嗎?
01/10 00:05, 31F

01/10 01:51, 2年前 , 32F
簡單講 函式占空間 但函式不在類別的Instance裡佔
01/10 01:51, 32F

01/10 01:52, 2年前 , 33F
關鍵字memory layout 可以去查一下
01/10 01:52, 33F

01/10 16:02, 2年前 , 34F
C++的精髓就在模組化
01/10 16:02, 34F

01/10 16:02, 2年前 , 35F
怎麼有人在那邊
01/10 16:02, 35F

01/10 16:02, 2年前 , 36F
土法煉鋼佔空間啊
01/10 16:02, 36F

01/10 21:31, 2年前 , 37F
佔空間是只有instructions佔空間,這各種function都是
01/10 21:31, 37F

01/10 21:31, 2年前 , 38F
一樣的。instance裡當然不佔空間 所有call的位址都可以
01/10 21:31, 38F

01/10 21:31, 2年前 , 39F
被statically resolved何須在instance裡佔空間?又不是
01/10 21:31, 39F

01/10 21:31, 2年前 , 40F
runtime polymorphism。D&E: What you don’t use, yo
01/10 21:31, 40F

01/10 21:31, 2年前 , 41F
u don’t pay for.
01/10 21:31, 41F

01/10 22:13, 2年前 , 42F
其實你可以把member function當一般free function加上
01/10 22:13, 42F

01/10 22:13, 2年前 , 43F
隱含this參數,static member function就像一般free fu
01/10 22:13, 43F

01/10 22:13, 2年前 , 44F
nction,只不過一般free function要access非public dat
01/10 22:13, 44F

01/10 22:13, 2年前 , 45F
a編譯器不會給過,雖然還是可在runtime存取。
01/10 22:13, 45F

01/10 23:05, 2年前 , 46F
https://godbolt.org/z/xYMhqo314 用ToT clang玩一下,
01/10 23:05, 46F

01/10 23:05, 2年前 , 47F
不開優化,三個Perimeter的code邏輯上都一樣,call sit
01/10 23:05, 47F

01/10 23:05, 2年前 , 48F
e也都會把this當第一個argument傳入rdi。
01/10 23:05, 48F

01/10 23:07, 2年前 , 49F
看你這麼愛玩this應該對這有興趣
01/10 23:07, 49F

01/10 23:07, 2年前 , 50F

01/10 23:07, 2年前 , 51F
01/10 23:07, 51F
文章代碼(AID): #1Xs2xOtv (C_and_CPP)
文章代碼(AID): #1Xs2xOtv (C_and_CPP)