C 基礎知識

2021-06-06 13:49:42 字數 1968 閱讀 3026

1:

jit(即時編譯)。乙個方法在第一次呼叫時

jit會把改方法的

il**轉換成

cpu指令,再次呼叫該方法時就只需執行對應的指令。方法第一次被呼叫的過程大致是:

1獲得方法的

il**;

2:分配記憶體;3:將

il**轉換成

cpu指令存在

2分配的記憶體中;

4:將方法表中對應該方法的指標指向

2分配的記憶體;

5:跳轉到

2分配的記憶體執行其中的指令,即該方法的

cpu指令。

2:as

的效能高於is。

is的作用是判斷當前型別與目標型別是否相容,即是否是同一型別或者目標型別是當前型別的父型別。強制型別轉換也要判斷型別的相容性,如果不相容就丟擲乙個型別轉換異常,如果你的**型別轉換用

is+強制型別轉換就做了兩次相容性判斷,而

as只有一次型別轉換。

3:c#

中的int

對應fcl

中的int32

,.net framework 64

中int

對應fcl

中的int64

,int

到底對應

int32

還是int64

重要嗎?不重要,那是

.net framework

的事,或者說這他媽是

cpu的事,同一型別,64位

cpu所需儲存的空間是32位

cpu的2倍。

4:string

是引用型別,常量字串都存在字串池中,如果乙個字串在**中多次出現,那麼這些都是對字串池的引用,

string s="a"+"b";

只分配了一次記憶體,編譯器會直接將其編譯成

string s="ab";s

是對字串池中

ab的引用。

5:大量字串的拼接用

stringbuilder

,少量則用字串相加,能用

+=則更好,

string.format

的效率是低下的,它的記憶體其實是params object +stringbuilder,

params

也是低效的,字串相加,或是取其中的一部分都是要重新分配記憶體,然後將對應的字串存入。

fcl大部分**都是用

c#寫的,而操作字串這一塊用的是非託管**寫的,處於對效能的考慮。

6:別看到

new就以為會在託管堆中分配記憶體,值型別的變數就是分配中線程棧上的,結構體雖然可以用

new,但是編譯器推斷出它是值型別,就會按照值型別的處理,當然

il**中是沒有

newobj

指令的。

7:靜態類被編譯成

sealed abstract

型別,所以他不能被繼承,不能被例項化,所以他的屬性和方法都是屬於型別的,沒有屬於物件的,它必須直接繼承

object。

8:const

和readonly

的區別,

il**中存的是

const

變數的值,而不是引用,所以修改是不可能的,如果乙個

dll只引用了另乙個

dll中的乙個

const

變數,那麼這個

dll是不會被引用的,因為編譯的時候就知道變數的值了,所以在執行的時候也不會分配記憶體,

readonly

表示你不能修改它的指向,但是可以修改它所指向變數的值。

9:泛型,

c#中的泛型和

c++的模版區別在於引用型別,

c++模版會每一種型別都會生成乙個新的型別,而

c#泛型中,引用型別用的是同乙個型別,只有值型別用的是不同的型別。因為引用都是乙個指標的引用,而值型別儲存所需的空間是不同的。

其他基礎知識,請看這篇部落格:這些天寫的技術微博

部落格:

C 基礎知識

抽象類 abstract class 一種不可以被例項化的類。抽象類中一般含有抽象方法,當然也可有具體實現。繼承類只有實現過所有抽象類的抽象方法後才能被例項化。介面 inte ce 只含有共有抽象方法 public abstract method 的類。這些方法必須在子類中被實現。反射 程式集包含模...

c 基礎知識

或運算的意義是什麼 0 0 0 0 1 1 1 0 1 1 1 1 無進製與運算的意義是什麼 在vc中,視窗的每個屬性對應乙個只有一位為1的16位的二進位制數,當增加某屬性做或運算 即可,取消某個屬性只需與 上這個屬性的取反。cs.style ws maximizebox 和cs.style cs....

C 基礎知識

1 malloc和new區別與聯絡 a malloc malloc為函式,需要標頭檔案,申請的無型別,需要強制轉換 free釋放。示例 char p char malloc 10 sizeof char free p b new new是運算子,不需要標頭檔案,申請的是有型別的,自動呼叫建構函式 d...