c 變數的 內聯賦值 vs 建構函式內賦值

2021-09-02 10:49:30 字數 1574 閱讀 8501

上下文:c#中變數的內斂賦值其實是在建構函式中完成的,jit會把變數的賦值語句放入每個建構函式開始的位置,因此,當類中有很多變數使用內聯賦值,同時類也有多個建構函式的時候,實際編譯生成的**量會以乘法的方式疊加。比如乙個類中有3個變數使用內聯賦值,有4個建構函式,那麼實際生成的賦值語句的數量將達到3x4=12句。

結論:盡量避免使用內聯賦值,優先使用建構函式內賦值

類**如下:

public class cat

public cat(string _name)

public cat(int _notuse)

public void shout()

} il生成的**如下:

//public cat(string _name)

.method public hidebysig specialname rtspecialname 

instance void  .ctor(string _name) cil managed

// end of method cat::.ctor

//public cat(int _notuse)

.method public hidebysig specialname rtspecialname 

instance void  .ctor(int32 _notuse) cil managed

// end of method cat::.ctor

//public cat()

.method public hidebysig specialname rtspecialname 

instance void  .ctor() cil managed

// end of method cat::.ctor

從上面3個建構函式的il**可以看出,當變數不使用內聯賦值的時候,建構函式內不會自行補充賦值語句

下面將貼上內聯賦值的cat

public class cat

public cat(string _name)

public cat(int _notuse)

public void shout()

} 其建構函式分別是:

.method public hidebysig specialname rtspecialname 

instance void  .ctor(string _name) cil managed

// end of method cat::.ctor

其他建構函式中同樣會增加賦值的那三句

.method public hidebysig specialname rtspecialname 

instance void  .ctor(int32 _notuse) cil managed

// end of method cat::.ctor

.method public hidebysig specialname rtspecialname 

instance void  .ctor() cil managed

// end of method cat::.ctor

C 賦值建構函式 複製建構函式

編譯器提供乙個不接受任何引數,也不執行任何操作的建構函式,稱之為預設建構函式 這是因為創造物件的時候總會呼叫預設建構函式 klunk klunk 定義 klunk lunk 宣告 使用預設建構函式 如果定義了建構函式,c 不會定義預設建構函式,如果希望建立物件時不顯示地對他進行初始化,則必須顯示的定...

c 中內斂函式 C 內聯函式

內聯函式是指用inline關鍵字修飾的函式。在類內定義的函式被預設成內聯函式。實質就是當需要呼叫乙個內聯函式時,不是去呼叫而是將該函式 整段插入到需要使用該內聯函式的地方,從而省去呼叫過程,提高了執行速度。缺點由於每當 呼叫到內聯函式,就需要在呼叫處直接插入一段該函式的 所以程式的體積將會增大,消耗...

C 中的拷貝構造 賦值建構函式

c 中的拷貝構造,賦值構造的形式如下 eg a a a a const a a a operator const a a 物件以值傳遞方式從函式返回時,若接受返回值的物件已經初始化過,則會呼叫賦值建構函式,且該物件還會呼叫析構函式,當物件中包含指標時,會使該指標失效,因此需要過載賦值建構函式,使用類...