[问题] 关于 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