初步了解記憶體機制

2022-09-19 00:03:12 字數 1532 閱讀 3661

對於計算機來說,儲存資料時通過申請記憶體來實現的,如果我們的資料是水的話,記憶體就是容器。對於int型的資料,需要以32bit大小的記憶體儲存,對於字串型別的需要8bit個單位大小的記憶體。

但是申請記憶體的時候到底是乙個什麼樣的機制呢?或者是怎麼儲存的機制呢?我們還是以水和容器的例子來表達。在計算機中,記憶體是存在位址的,或者說是,容器是按照一定的順序排列好的。當你申請需要儲存的時候,就會給系列的容器。對於計算機來說,申請記憶體是需要耗費比較多的時間的是,所以如果我們能合理的根據我們的資料的大小,一次性給予乙個合適大小的記憶體,或者申請記憶體的次數少一些,那麼對於記憶體使用的效率來說是有極大的好處的。

所以我們可與i使用這樣的方法,申請一部分記憶體,頭部的兩個節點用於儲存和這部分記憶體資訊相關的內容

這樣我們就知道了我們申請了多大的記憶體,以及已經使用了多大的記憶體。

此時,我們考慮另外乙個問題,如果記憶體裡面儲存的資料的型別是不一致的呢?例如,0位置儲存的是int型,1位置儲存的是str型別的,那麼佔據的記憶體大小就不一樣了,他們的位址就不是均勻遞增的了。通俗來說,還是容器裡面放水,如果我們設定的是每八個容器裡放的就是同一種溶液,這樣我們要找某種溶液,直接在第一種溶液的位置的基礎上加n個8的就可以找到了。但是如果資料型別不一樣,第一種溶液需要8個容器,第二種溶液需要16個,第三個需要4個,這樣就很繁瑣了,我們無法通過位址取找到對應的溶液。

由此,就引入了另外一種方式,叫做元素外接。我們將容器劃分為兩部分,第一部分用來存放位址,第二部分用來存放我們需要用的資料。怎麼理解呢?我們知道,容器的位址也是int型的。我們可以先將儲存的int型資料,str型資料,float型資料的位址全都提出來,然後將所以的位址全都放進容器裡,這樣就可以通過查詢連續的位址,阿里找到對應的元素。

在解決了這個問題的基礎上,我們考慮一下對記憶體裡面的資料進行操作時候的難易程度,也就是時間複雜度。

遍歷操作:把所有元素都訪問一遍,時間複雜度為o(n)。

pop():去掉末尾元素,直接訪問最後乙個元素,時間複雜度為o(1).

pop(i):考慮最壞時間複雜度,也就是將第乙個元素出來去掉,那麼後面的所有的元素都要往前移動乙個空格。時間複雜度為(n)。

contains(item):看是否包含某個元素。需要做乙個遍歷,時間複雜度為n。

set slice:設定某部分元素。考慮最壞時間複雜度,先設定前k個元素,原來的元素全部往後移動,所以時間複雜度為n+k。

reverse:反轉。時間複雜度為n。

multiply:n個元素,乘以k個數。時間按複雜度為n*k。

concatenate:代表使用的+, 把兩個列表加到一起, k是第二個列表中的元素個數。時間複雜度為k。

sorted:時間複雜度為nlogn。留疑問。

到目前來說,我們能發現,資料結構是用來研究如果更加高效的使用記憶體的一種工具,交叉了數學和資訊這兩個學科。但是這對於裡面我們後面的演算法有至關重要的作用。

C 的初步了解記憶體

一 new delete int p2 new int 不保證是零 int p3 new int 100 int p4 new int 5 delete p2 delete p3 delete p4 二 定位分配 char buf 100 new buf int 25 不存在定位分配所對應的dele...

C Boost 初步了解

boost是由c 標準委員會成員發起 眾多c 業界高人參與設計並實現的乙個涉及面廣 質量高且業已廣泛使用的c 標準後備庫,其中 tr1已經被納入c 0x標準庫。不論從風格和內容組織上講,都可以認為boost專案是c 標準庫的延伸。截止到boost 1.43版本,boost專案擁有大約100個用途廣泛...

jquery 初步了解

js 建立函式有以下三種方法 1 函式關鍵字 function foo x 2 匿名函式 var func function x 3 建構函式 var func new function x alert x 建構函式每次執行時都解析函式主題 頻繁呼叫建構函式效率很低 並且建構函式不能遞迴使用 關鍵字...