日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 类里面,函数占用存储空间问题

發布時間:2025/3/21 c/c++ 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 类里面,函数占用存储空间问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  轉載自:http://blog.163.com/xping_lsr/blog/static/19654034520119804131721/

先看兩段代碼:


代碼段1:
class A
{
public:
int print(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}

輸出結果:
Size of A =1

代碼段2:

class A
{
public:
int print1(){ cout<<"This is A"<<endl;}
int print2(){ cout<<"This is A"<<endl;}
int print3(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}

輸出結果:
Size of A =1

對象的大小是它的數據成員所占存儲空間之和,就和結構體一樣。類中的函數是所有該類對象通用的方法,不算作對象的成員,因此也不算在對象的存儲空間內

問題:類里面不管有多少個函數,這個類的對象只占1個字節的內存。這個字節的內存的內容是什么?是指針嗎?指針不是占4個字節嗎?

當類中類有定義任何變量的時候,類的對象都是1個字節的,當類中沒有任何變量的時候,這個類里沒有任何真正的成員變量,所以大小應該是0,但0大小不好在內存中定位一個地址,所以,就規定它大小為0的對象要占一字節空間,以便讓它擁有一個合法的地址。如果是有派生類的,還有考慮到內存對齊的問題的。

另外涉及到虛函數的話又不一樣了。如

class A
{
public:
virtual int print(){ cout<<"This is A"<<endl;}
};
如果sizeof(A)的話,得出的是4。

原因是涉及到虛函數的實現問題。

class Class1

{

??? m_data1;

?? m_data2;

? virtual vfunc1()

? virtual vfunc2()

? virtual vfunc3()

};

?

Class1對象實例

vptr

m_data1

m_data2

通過vptr指針找到虛函數表

?

Vtable(虛函數表)

(*vfunc1)()

(*vfunc2)()

(*vfunc3)()

?

Class1::vfunc1()

Class1::vfunc2()

Class1::vfunc3()

?

?

所以回到原來的問題,A中只有一個或者幾個虛函數的話,沒有成員變量,那么類A相當于含有一個vptr指向虛函數表的指針,所以sizeof(A)=4。

?

還有一點,如

class B

{

};

class B2

{

};

class C:public B

{

};

class D:public virtual B

{

};

class E:public B,public B2

{

};

sizeof(B) = 1;?? sizeof(B2) = 1;? sizeof(C) = 1;? sizeof(D) = 4;? sizeof(E) = 1;

空類所占空間為一(上文以解釋),單一繼承的空類空間也是1,多重繼承的空類空間還是1,但是虛繼承涉及到虛表(虛指針),所以sizeof(D)=4。

?

轉載于:https://www.cnblogs.com/zhangwuji/p/5308671.html

總結

以上是生活随笔為你收集整理的C++ 类里面,函数占用存储空间问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。