c/c++內(nèi)存分配大小實(shí)例講解
測(cè)試平臺(tái):linux 32位系統(tǒng)
用sizeof()運(yùn)算符計(jì)算分配空間大小。單位:字節(jié)
1. 數(shù)組名與變量名的區(qū)別
int main() { char q[] = "hello"; cout << "q:" << sizeof(q) << endl; char *mq = q; cout << "mq:" << sizeof(mq) << endl; const char *p = "hello"; cout << "p:" << sizeof(p) << endl; }
結(jié)果
q:6
mq:4
p:4
分析
q是數(shù)組名,申請(qǐng)內(nèi)存是編譯器記住了,但是賦值給mq后,mq和p一樣是一個(gè)普通的指針了,大小為4.
總之:c/c++沒(méi)有辦法知道指針?biāo)傅膬?nèi)存容量,除非在申請(qǐng)時(shí)記住它。
2. 類的內(nèi)存分配
2.1 空類
#include <iostream> using namespace std; class A { }; int main() { A a; cout << sizeof(a) << endl; }
結(jié)果
1
分析
所謂類的實(shí)例化就是在內(nèi)存中分配一塊地址(空類同樣可以被實(shí)例化),每個(gè)實(shí)例在內(nèi)存中都有一個(gè)獨(dú)一無(wú)二的地址,為了達(dá)到這個(gè)目的,編譯器往往會(huì)給一個(gè)空類隱含的加一個(gè)字節(jié),這樣空類在實(shí)例化后在內(nèi)存得到了獨(dú)一無(wú)二的地址.因?yàn)槿绻疹惒浑[含加一個(gè)字節(jié)的話,則空類無(wú)所謂實(shí)例化了(因?yàn)轭惖膶?shí)例化就是在內(nèi)存中分配一塊地址。
2.2 類只有成員變量
#include <iostream> using namespace std; class A { public: int val; }; int main() { A a; cout << sizeof(a) << endl; }
結(jié)果
4
解釋
這個(gè)4是int類型類的成員變量所占字節(jié)數(shù)
2.2 類含有成員函數(shù)
#include <iostream> using namespace std; class A { public: A(int value) : val(value) {} int val; }; int main() { A a(3); cout << sizeof(a) << endl; }
結(jié)果
4
分析
這個(gè)4是int類型類的成員變量所占字節(jié)數(shù)。即成員函數(shù)沒(méi)有占空間。原因是這樣的:成員函數(shù)不屬于類(或類的對(duì)象),所有的成員函數(shù)和全局函數(shù)都在代碼段,在調(diào)用成員函數(shù)時(shí),會(huì)隱式的通過(guò)this指針過(guò)去調(diào)用。
3.3 類中含有靜態(tài)成員
#include <iostream> using namespace std; class A { public: A(int value) : val(value) {} int val; static int sta_val; }; int A::sta_val = 3; int main() { A a(3); cout << sizeof(a) << endl; }
結(jié)果
4
分析
這個(gè)4仍然是int類型類的成員變量所占字節(jié)數(shù)。static變量存放于靜態(tài)區(qū),并不和普通成員變量(存于棧)放在一起。
3.4 類中含有virtural函數(shù)
#include <iostream> using namespace std; class A { public: int val; virtual void fuc() { cout << "hello" << endl; } }; int main() { A a; cout << sizeof(a) << endl; }
結(jié)果
8
分析
virtual 會(huì)增加4個(gè)字節(jié)大小的空間。原因:增加一個(gè)virtual ,會(huì)增加一個(gè)虛函數(shù)表指針(即使有多個(gè)虛函數(shù),也僅有一個(gè)虛函數(shù)表),例證
#include <iostream> using namespace std; class A { public: int val; virtual void fuc() { cout << "hello" << endl; } virtual void fuc2() { cout << "hello" << endl; } }; int main() { A a; cout << sizeof(a) << endl; }
結(jié)果
8
3.5 子類空間分配
例子1
#include <iostream> using namespace std; class A { public: int val; }; class B : public A { int valb; }; int main() { B b; cout << sizeof(b) << endl; }
結(jié)果
8
例子2
#include <iostream> using namespace std; class A { public: int val; virtual void fuc() {} }; class B : public A { int valb; }; int main() { B b; cout << sizeof(b) << endl; }
結(jié)果
Bb
分析
4 + 4 + 4(虛函數(shù)表指針)
到此這篇關(guān)于c/c++內(nèi)存分配大小實(shí)例講解的文章就介紹到這了,更多相關(guān)c/c++內(nèi)存分配大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象的區(qū)別解析
在C++用new創(chuàng)建對(duì)象和不用new創(chuàng)建對(duì)象是有區(qū)別的,不知你是否清楚的了解它們到底有什么樣的區(qū)別呢?下面小編就用示例來(lái)告訴大家吧,需要的朋友可以過(guò)來(lái)參考下2013-07-07C++ LibCurl實(shí)現(xiàn)Web指紋識(shí)別功能
Web指紋識(shí)別是一種通過(guò)分析Web應(yīng)用程序的特征和元數(shù)據(jù),以確定應(yīng)用程序所使用的技術(shù)棧和配置的技術(shù),本文將通過(guò)C++中LibCurl庫(kù)實(shí)現(xiàn)簡(jiǎn)單是指紋識(shí)別功能,感興趣的可以了解下2023-11-11C/C++中memset,memcpy的使用及fill對(duì)數(shù)組的操作
這篇文章主要介紹了C/C++中memset,memcpy的使用及fill對(duì)數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12編寫(xiě)C語(yǔ)言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問(wèn)題實(shí)例
這篇文章主要介紹了編寫(xiě)C語(yǔ)言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問(wèn)題實(shí)例,文中附錄了一個(gè)各種進(jìn)制間的轉(zhuǎn)換程序代碼,需要的朋友可以參考下2015-08-08