成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

「譯」內(nèi)存管理碰撞課程

BDEEFE / 900人閱讀

摘要:你可以從內(nèi)存中直接拿東西,也可以直接往內(nèi)存里存東西當(dāng)你把或者其它語言編譯為時,編譯工具會在里增加一些輔助代碼。

作者:Lin Clark
譯者:Cody Chan
原帖鏈接:A crash course in memory management

這是圖解 SharedArrayBuffers 系列的第一篇:

內(nèi)存管理碰撞課程

圖解 ArrayBuffers 和 SharedArrayBuffers

用 Atomics 避免 SharedArrayBuffers 競爭條件

為了更好地理解 JavaScript 里的 ArrayBuffer 和 SharedArrayBuffer,首先應(yīng)該了解點內(nèi)存管理知識

你可以把一個機(jī)器的內(nèi)存想成一個一個的盒子,我把它們當(dāng)作辦公室的郵箱或者幼兒園里放小孩東西的格子

如果你想把某個東西留給某個小孩,你就把東西放到格子里

每個盒子旁邊都有一個編號,這就是內(nèi)存地址,用于告訴別人如何去找到你留的東西

每個盒子大小都一樣,可以存放特定容量東西。盒子的具體容量取決于機(jī)器,這個大小我們稱為字長,一般為 32 位或者 64 位。不過,為了展示方便,我這里字長用 8 位

如果你想把數(shù)字 2 放到盒子里,這很容易做到,因為數(shù)字很容易用二進(jìn)制表示

但是如果你想放一個非數(shù)字類型的呢?比如字母 H?

我們需要一種方式可以用數(shù)字來表示它,這需要借助編碼技術(shù),類似 UTF-8 。首先,我們需要一個東西可以把字母轉(zhuǎn)為數(shù)字……類似一個編碼環(huán),接下來就可以存儲了

當(dāng)我們從盒子里取回的時候,我們需要把取出的數(shù)字放到解碼環(huán)里翻譯回字母 H

自動內(nèi)存管理

如果你是寫 JavaScript 的,實際上你根本不需要關(guān)心內(nèi)存,它對用戶是透明的,這意味著你無法直接操縱內(nèi)存

與此相對的, JS 引擎扮演著中間人角色,它為你管理好內(nèi)存

我們用 React 舉個例子,比如創(chuàng)建一個變量

JS 引擎通過一個編碼器得到這個變量的二進(jìn)制表示

然后,它會找到內(nèi)存中可以放這個值的位置,這個過程稱為內(nèi)存分配

緊接著,引擎會持續(xù)追蹤這個變量,看其是否還在程序中被使用。如果這個變量已經(jīng)沒有引用了,這塊內(nèi)存會被回收,JS 引擎就又可以在這里放新的值了

追蹤內(nèi)存中的變量(字符串、對象以及其它類型)并且在沒有引用的時候清除它們的過程我們稱作垃圾回收

類似 JavaScript 這種代碼無法直接處理內(nèi)存的語言叫做自動內(nèi)存管理(memory-managed)語言

內(nèi)存自動管理確實讓開發(fā)者省了不少心,但是這也會帶來額外的開銷,這些額外開銷會讓程序的性能無法評估

手動內(nèi)存管理

手動內(nèi)存管理的語言不太一樣,繼續(xù)上面例子,看 React 用 C 寫的話(借助 WebAssembly 是 可能的)會如何處理內(nèi)存

不像 JavaScript,C 沒有多帶帶的內(nèi)存管理抽象層,相反,你得直接與內(nèi)存打交道。你可以從內(nèi)存中直接拿東西,也可以直接往內(nèi)存里存東西

當(dāng)你把 C 或者其它語言編譯為 WebAssembly 時,編譯工具會在 WebAssembly 里增加一些輔助代碼。比如,它會加入編解碼的代碼,這些代碼我們稱為運行時環(huán)境,運行時環(huán)境會幫助處理一些類似 JS 引擎幫 JS 做的事

但是,對于手動管理內(nèi)存的語言,運行時不會包括垃圾回收

這并不意味著你需要完全由自己處理內(nèi)存,即使在這類語言里,運行時你依然會得到一些輔助。比如,C 語言運行時會在一個 free list 里追蹤可以使用的內(nèi)存地址

你可以使用 malloc 函數(shù)(內(nèi)存分配的簡稱)向運行時發(fā)出可以滿足你數(shù)據(jù)存儲需要的內(nèi)存請求,這些內(nèi)存會被從 free list 拿下來。當(dāng)你用完了,需要調(diào)用 free 去釋放內(nèi)存,這些內(nèi)存會被加回 free list

你必須清楚知道什么時候去調(diào)用這些函數(shù),這就是為什么我們叫手動內(nèi)存管理

作為一個開發(fā)者,知道什么時候去釋放什么地方的內(nèi)存是一件困難的事。如果你在錯誤時機(jī)處理了,這很可能會導(dǎo)致 BUG,甚至安全漏洞;如果你不處理,就會導(dǎo)致內(nèi)存泄露

這就是為什么很多語言選擇自動內(nèi)存管理去避免人為錯誤,但是這犧牲了性能,下篇文章我還會談到這些

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/83579.html

相關(guān)文章

  • 」圖解 ArrayBuffers 和 SharedArrayBuffers

    摘要:因為有了類型猜測,引擎通常會比真實需要預(yù)留更多的空間。如果你是手動維護(hù)的內(nèi)存,可以根據(jù)實際使用需求來決定分配和釋放內(nèi)存的策略很多時候,這不是什么大不了的事。大多數(shù)場景并不會對性能要求那么苛刻,反而更多地?fù)?dān)心管理內(nèi)存的麻煩。 作者:Lin Clark 譯者:Cody Chan 原帖鏈接:A cartoon intro to ArrayBuffers and SharedArrayBu...

    stormjun 評論0 收藏0
  • 」用 Atomics 避免 SharedArrayBuffers 競爭條件

    摘要:如果期間有其它線程更新了,則會先拿到新的值重新運算一次多運算的競爭條件這些運算符成功避免了單運算中的競爭條件。 作者:Lin Clark 譯者:Cody Chan 原帖鏈接:Avoiding race conditions in SharedArrayBuffers with Atomics 這是圖解 SharedArrayBuffers 系列的第三篇: 內(nèi)存管理碰撞課程 圖...

    flyer_dev 評論0 收藏0
  • 2017-09-28 前端日報

    摘要:前端日報精選等新方法簡介寫作建議和性能優(yōu)化小結(jié)前端面試之篇第期關(guān)于雪碧圖預(yù)處理和后處理方案的討論你的網(wǎng)站可以一鍵變色嗎中文譯內(nèi)存管理碰撞課程掘金阿里前端面試點目標(biāo),想成為一名好的前端工程師那些事函數(shù)能干啥如何在日常搬磚中使用最全, 2017-09-28 前端日報 精選 before(),after(),prepend(),append()等新DOM方法簡介css寫作建議和性能優(yōu)化小結(jié)前...

    xuhong 評論0 收藏0
  • []編寫高性能對垃圾收集友好的代碼

    摘要:創(chuàng)建多個對象同樣也會影響垃圾回收。譯注這里清除的是變量中存放的數(shù)據(jù)避免創(chuàng)建對象當(dāng)然,降低垃圾回收最簡單的方式是不要去創(chuàng)建對象。并不存在無痛地有效刪除數(shù)組中某個對象的方法。 部分翻譯自原文地址 若你想讓你的游戲有60楨/秒的體驗,你必須要做的就是在16浩渺內(nèi)完成所有事:子彈運動,創(chuàng)建實體,控制碰撞,軌跡,變換場景,控制輸入,播放音效。主流的游戲循環(huán)中,你需要做到盡可能高效。即便在30楨/...

    cfanr 評論0 收藏0
  • 使用Laya引擎開發(fā)微信小游戲(下)

    摘要:點擊進(jìn)入發(fā)布界面,在發(fā)布平臺選擇微信小游戲,此時生成可以在微信開發(fā)者工具下運行的版本使用微信開發(fā)者工具打開,已經(jīng)可以完美運行了。 本文由云+社區(qū)發(fā)表 6. 動畫 6.1 創(chuàng)建傘兵對象 在src目錄下創(chuàng)建一個新目錄role,用來存放游戲中角色。 在role里創(chuàng)建一個傘兵Soldier.ts對象文件。 module role{ export class Soldier extend...

    ivan_qhz 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<