C/C++?函數(shù)的存儲(chǔ)位置和占用空間詳解
成員函數(shù)和this指針
C++類的成員函數(shù)并不以函數(shù)指針的形式存儲(chǔ)在類的結(jié)構(gòu)中。類的成員函數(shù)在編譯時(shí)就已經(jīng)確定了地址,它們不占用類實(shí)例的存儲(chǔ)空間。這意味著,無論你創(chuàng)建多少個(gè)類的對(duì)象,成員函數(shù)只有一份拷貝。
當(dāng)你調(diào)用一個(gè)對(duì)象的成員函數(shù)時(shí),編譯器知道去哪里找到這個(gè)函數(shù)的代碼,并且知道如何傳遞特殊的隱藏參數(shù)this
,這個(gè)參數(shù)是一個(gè)指向調(diào)用對(duì)象的指針,用于訪問對(duì)象的數(shù)據(jù)成員。
然而,你可以在類中定義成員函數(shù)指針,并且這個(gè)指針會(huì)占用類實(shí)例的存儲(chǔ)空間。這個(gè)指針的大小通常是4字節(jié)(在32位系統(tǒng)上)或8字節(jié)(在64位系統(tǒng)上),但這取決于具體的實(shí)現(xiàn)。
總的來說,成員函數(shù)本身并不存儲(chǔ)在類的實(shí)例中,但是成員函數(shù)指針可以作為類的成員變量,占用類實(shí)例的存儲(chǔ)空間。
成員函數(shù)并不占用對(duì)象的內(nèi)存空間
成員函數(shù)并不占用對(duì)象的內(nèi)存空間。無論你在類中聲明多少個(gè)成員函數(shù),每個(gè)對(duì)象的大小都不會(huì)因此改變。這是因?yàn)槌蓡T函數(shù)在編譯時(shí)就已經(jīng)確定了地址,它們存儲(chǔ)在代碼段,而不是每個(gè)對(duì)象的內(nèi)存空間中。
this
指針是一個(gè)隱含的參數(shù),當(dāng)你調(diào)用一個(gè)對(duì)象的成員函數(shù)時(shí),編譯器會(huì)自動(dòng)將對(duì)象的地址作為this
指針傳遞給成員函數(shù)。this
指針用于訪問調(diào)用對(duì)象的數(shù)據(jù)成員和其他成員函數(shù)。
但是需要注意的是,this
指針并不存儲(chǔ)成員函數(shù)的地址。它只是一個(gè)指向當(dāng)前對(duì)象的指針,用于在成員函數(shù)內(nèi)部訪問對(duì)象的數(shù)據(jù)成員和其他成員函數(shù)。成員函數(shù)的地址是在編譯時(shí)確定的,存儲(chǔ)在代碼段中。
不分函數(shù)類型
無論是全局函數(shù)、靜態(tài)成員函數(shù),還是const成員函數(shù),它們的行為在這方面都是類似的。這些函數(shù)的代碼在編譯時(shí)就已經(jīng)確定了位置,存儲(chǔ)在代碼段中,而不是存儲(chǔ)在每個(gè)對(duì)象的內(nèi)存空間中。下面是一些額外的細(xì)節(jié):
- 全局函數(shù):全局函數(shù)不屬于任何類,它們的地址在編譯時(shí)就確定了,存儲(chǔ)在代碼段中。
- 靜態(tài)成員函數(shù):靜態(tài)成員函數(shù)屬于類,而不是類的對(duì)象。你可以在沒有類的對(duì)象的情況下調(diào)用靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)的地址在編譯時(shí)就確定了,存儲(chǔ)在代碼段中。靜態(tài)成員函數(shù)沒有
this
指針,因?yàn)樗鼈儾慌c特定的對(duì)象關(guān)聯(lián)。 - const成員函數(shù):const成員函數(shù)是一種特殊類型的成員函數(shù),它們不能修改對(duì)象的數(shù)據(jù)成員(除非這些成員被聲明為
mutable
)。const成員函數(shù)的地址在編譯時(shí)就確定了,存儲(chǔ)在代碼段中。在const成員函數(shù)中,this
指針是一個(gè)指向const的指針,這意味著你不能通過this
指針來修改對(duì)象的數(shù)據(jù)成員。
總的來說,函數(shù)(無論是全局函數(shù)、靜態(tài)成員函數(shù),還是const成員函數(shù))的代碼都存儲(chǔ)在代碼段中,而不是對(duì)象的內(nèi)存空間中。
Lambda函數(shù)
Lambda函數(shù)在C++中是一個(gè)特殊的對(duì)象類型,被稱為閉包類型。每個(gè)Lambda表達(dá)式都會(huì)生成一個(gè)唯一的閉包類型。Lambda函數(shù)的代碼部分(即{}中的部分)在編譯時(shí)確定,存儲(chǔ)在代碼段中,這與其他函數(shù)相同。
然而,Lambda函數(shù)可能會(huì)捕獲其周圍的變量,這些被捕獲的變量被存儲(chǔ)在Lambda函數(shù)對(duì)象的內(nèi)部。這些變量的存儲(chǔ)位置取決于Lambda函數(shù)對(duì)象的存儲(chǔ)位置。如果Lambda函數(shù)對(duì)象在棧上創(chuàng)建,那么這些捕獲的變量也在棧上。如果Lambda函數(shù)對(duì)象在堆上創(chuàng)建(例如,通過使用new
關(guān)鍵字),那么這些捕獲的變量也在堆上。
例如:
int x = 10; auto lambda = [x]() { return x + 1; };
在這個(gè)例子中,lambda
是一個(gè)Lambda函數(shù)對(duì)象,它捕獲了變量x
。x
的值被存儲(chǔ)在lambda
對(duì)象內(nèi)部,而lambda
對(duì)象本身在棧上創(chuàng)建。
總的來說,Lambda函數(shù)的代碼部分在代碼段中,被捕獲的變量存儲(chǔ)在Lambda函數(shù)對(duì)象的內(nèi)部,這些變量的存儲(chǔ)位置取決于Lambda函數(shù)對(duì)象的存儲(chǔ)位置。
到此這篇關(guān)于C/C++ 函數(shù)的存儲(chǔ)位置和占用空間的文章就介紹到這了,更多相關(guān)C++ 函數(shù)的存儲(chǔ)位置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java string對(duì)象上的操作,常見的用法你知道嗎
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java String類用法展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-08-08C語言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門級(jí)方法簡(jiǎn)介
這篇文章主要介紹了C語言中對(duì)于循環(huán)結(jié)構(gòu)優(yōu)化的一些入門級(jí)方法,包括算法設(shè)計(jì)的改進(jìn)來提高一些并行性等方法,要的朋友可以參考下2015-12-12C語言實(shí)現(xiàn)學(xué)生個(gè)人消費(fèi)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生個(gè)人消費(fèi)管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08C++深入講解類與對(duì)象之OOP面向?qū)ο缶幊膛c封裝
學(xué)習(xí)過C語言的小伙伴知道:C語言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題,接下來讓我們?cè)敿?xì)的了解2022-05-05visual?studio?將編譯后的dll等文件自動(dòng)復(fù)制到指定目錄的方法
這篇文章主要介紹了visual?studio?將編譯后的dll等文件自動(dòng)復(fù)制到指定目錄,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03C++中::SHCreateDirectoryEx函數(shù)使用方法
::SHCreateDirectoryEx用于創(chuàng)建多級(jí)目錄,類似于mkdir -p命令,本文主要介紹了C++中::SHCreateDirectoryEx函數(shù)使用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03