五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

研究筆記

2022-09-21 19:38 作者:スレーブ_スレイヤー  | 我要投稿

前兩天我一直有一個疑問:一個復(fù)雜的類在編譯以后,以什么樣的形態(tài)存在于內(nèi)存。

我的設(shè)想是,所有字段按順序排列,然后是每個函數(shù)的地址按順序排列。

現(xiàn)在看極度無厘頭的想法,當(dāng)時卻深信不疑,想了想原因也很簡單:

按照面向?qū)ο蟮乃枷?,字段和函?shù)必定放在一起。


結(jié)論就是,面向?qū)ο蟮乃枷胫贿m用于編碼階段,在運行時類的函數(shù)和字段沒有任何聯(lián)系。類只是對內(nèi)存的抽象,是由人類創(chuàng)造出的概念,計算機(jī)內(nèi)部的運行是沒有這個概念的。


于是結(jié)論1:在運行時(或者說編譯以后),一個類的字段和函數(shù)沒有任何聯(lián)系。

疑問:怎么保證函數(shù)的正確調(diào)用?第一個參數(shù)傳this指針就行了。調(diào)用方怎么知道this指針的地址?編譯器會確保調(diào)用方知道。Why?object->fun();類似的句式,意味著調(diào)用方一定持有this指針,編譯器做的只是把這個指針加到了第一個參數(shù)。


由此衍生出了一個新的問題,泛型類的函數(shù)調(diào)用又是怎么樣的?寫了幾個例子反匯編以后,結(jié)論也很單純,編譯器會在最后添加一個參數(shù)傳入泛型對象的大小。但還有一個問題,程序怎么知道對象具體的類型呢?例如兩個int和一個INT64都是8字節(jié)。

我在官方STL的函數(shù)里沒看到處理這些的代碼,這些信息最終是怎么存儲的依舊是未知。


但這不重要,我真正關(guān)心的是il2cpp編譯方式下,泛型的處理。

上面的結(jié)論都是基于C++的vector,C#的List又是什么情況?

結(jié)論也很單純甚至有點撈:il2cpp編譯器會為每一個泛型類型的函數(shù)調(diào)用單獨生成一份匯編代碼。聽起來很撈,幾乎一樣的邏輯生成了可能有幾百幾千份代碼,但它就是這么做的。

當(dāng)然,我還發(fā)現(xiàn)了幾個比較詭異的地方,我一直認(rèn)為STL存儲的是對象的引用(地址),但是無論是vector還是List,它存儲的都是對象里的值。JAVA表示完全無法理解。

當(dāng)然兩者都是可行的,并且是可以指定的,但是Java就不行,不存在在一個List里存儲對象的值,只能存引用,如果存了多個相同的引用,改變其中一個其它的也會跟著改變。


結(jié)論2:il2cpp編譯下的C#泛型函數(shù),如果指定的類型是引用,那么遵循同一套邏輯;如果不是,那么單獨為這個函數(shù)生成一份匯編代碼。

差不多就是這樣吧,Java用久了真的有些思維慣性,忽略了一些明明知道的,底層的東西。

研究筆記的評論 (共 條)

分享到微博請遵守國家法律
乐业县| 孟州市| 中方县| 瑞安市| 汶上县| 长葛市| 桑植县| 柯坪县| 芒康县| 维西| 刚察县| 安西县| 拉萨市| 丘北县| 遵义市| 施秉县| 陆河县| 定南县| 丹东市| 温泉县| 兴文县| 晋江市| 鸡泽县| 纳雍县| 新泰市| 平武县| 东至县| 板桥市| 鹤峰县| 高平市| 德保县| 山丹县| 封丘县| 二手房| 沁阳市| 岑溪市| 铁岭县| 团风县| 油尖旺区| 仪陇县| 汉源县|