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

作者: happykaka (快樂卡卡)   2022-01-07 20:15:18
開發平台(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 的時候發現了這種用法
所以來請問大家的看法
作者: nh60211as   2022-01-07 20:32:00
你省了什麼空間,兩個class都要存長寬變數
作者: happykaka (快樂卡卡)   2022-01-07 21:51:00
我就是不知道啊,物件的函式到底是怎樣配置和執行的,一般成員函式和靜態成員函式的配置和執行方式又是差在裡?我找到的都是變數的,找不太到函式方面的資料。
作者: lycantrope (阿寬)   2022-01-07 22:08:00
我以為物件函式是放在type,並不會跟著物件本身吧
作者: stucode   2022-01-07 22:15:00
一般成員函式(無論靜態與否)都是不佔物件空間的。virtual function 例外。
作者: ko27tye (好滋好滋)   2022-01-07 23:53:00
省空間是在static修飾成員變數的狀況吧 舉例來說100個丈夫共用一個老婆 很省空間阿
作者: yesiah   2022-01-08 00:24:00
沒有省空間,static member function 跟 friend function功能上差不多,最大差別是 static 定義在 class 內,另一個隨便你放https://stackoverflow.com/a/2315166
作者: CoNsTaR ((const *))   2022-01-08 04:47:00
一般 member function 和 static 的差別就是一般 memberfunction 有一個隱含的 this 參數啊你用 static 然後又傳 this 進去,那直接去寫 C 不就好了orz
作者: Dracarys (MayShowGunMore)   2022-01-08 07:18:00
看到一半 跟樓上想的一樣
作者: Lipraxde (Lipraxde)   2022-01-08 11:58:00
有時候看到 C++ 中怪怪的用法,都不太能確定是真的怪還是是自己孤陋寡聞沒見過的 design pattern XD
作者: happykaka (快樂卡卡)   2022-01-08 12:44:00
請問 CoNsTaR版友 說的「直接去寫 C」是為什麼呢?回 Lipraxde,我很確定是真的怪,所以我想知道怪在哪裡
作者: b0920075 (Void)   2022-01-08 17:51:00
C++的語法背後就是幫你弄好好讓你方便用,結果你用更麻煩的方法去做一樣的事情還沒啥好處
作者: happykaka (快樂卡卡)   2022-01-08 23:06:00
所以靜態會省空間是指靜態變數,靜態函式沒差。把一般成員函式就可以做的事,用靜態成員函式來繞路,沒有任何好處,因此不建議這樣使用,是嗎?
作者: sarafciel (Cattuz)   2022-01-09 19:55:00
C++有sizeof可以看某個型態占的空間大小 你可以試試看用靜態函式跟一般成員函式有沒有差XD
作者: happykaka (快樂卡卡)   2022-01-10 00:04:00
2個類別的size都是8,因為都是2個int,所以類別裡的函式確實不佔空間,是這樣嗎?
作者: sarafciel (Cattuz)   2022-01-10 01:51:00
簡單講 函式占空間 但函式不在類別的Instance裡佔關鍵字memory layout 可以去查一下
作者: TRFgee (ASIAGODGEE)   2022-01-10 16:02:00
C++的精髓就在模組化怎麼有人在那邊土法煉鋼佔空間啊
作者: Dracarys (MayShowGunMore)   2022-01-10 21:31:00
佔空間是只有instructions佔空間,這各種function都是一樣的。instance裡當然不佔空間 所有call的位址都可以被statically resolved何須在instance裡佔空間?又不是runtime polymorphism。D&E: What you don’t use, you don’t pay for.其實你可以把member function當一般free function加上隱含this參數,static member function就像一般free function,只不過一般free function要access非public data編譯器不會給過,雖然還是可在runtime存取。https://godbolt.org/z/xYMhqo314 用ToT clang玩一下,不開優化,三個Perimeter的code邏輯上都一樣,call site也都會把this當第一個argument傳入rdi。看你這麼愛玩this應該對這有興趣https://youtu.be/caXxUi_lykshttps://wg21.link/p0847

Links booklink

Contact Us: admin [ a t ] ucptt.com