首先看乙個氣泡排序的**,如下:
#include
#if 1
void
maopao
(int a)
//此處形參等同於int *a}}
}#endif
intmain
(int argc,
char
const
*ar**)
;maopao
(a);
for(i=
0;i<
sizeof
(a)/
sizeof
(int
);i++
)printf
("%d"
,a[i]);
//列印排序後的陣列
return0;
}
先對上述氣泡排序做個解讀,這個排序是有問題的。可以複製到除錯機看一下現象。正常情況下傳遞陣列的時候, 要把陣列元素的個數也傳遞過來。正確的**如下所示。
#include
#if 1
void
maopao
(int
*a,int n)}}
}#endif
intmain
(int argc,
char
const
*ar**)
;maopao
(a,5);
for(i=
0;i<
sizeof
(a)/
sizeof
(int
);i++
)printf
("%d"
,a[i]);
return0;
}
接著正確**解讀,執行後列印如下
由上述發現列印出來為2.
思考1:一位陣列做形參,實際上是乙個指標。所有型別的指標都是四個位元組,為什麼會是2?不應該是1嗎?
解讀血案1:一定要看清楚每個字,尤其是標粗的
在計算機記憶體中,每乙個位元組單元,都有乙個編號,稱為位址
在計算機中是以位元組(byte)為單位儲存。1 byte=8 bit(一位二進位制數)
位址是一片記憶體中每個位元組(byte)的編號,就好比房號是一棟辦公樓中每個房間的編號一樣,假如我所在的辦公樓房間數量總共不超過1000間,那麼我用乙個三位數來表示就足夠了,比如302、508等等。
同樣的道理,假如計算機記憶體的位元組總數不超過1000個,也可以用三位數來表達,換算成二進位制數,最多也就是11 1110 0111(即十進位制的999),也就說說用10bits就可以完全表示1000以下的所有位元組的編號的。但假如我們的記憶體有多達4gb個位元組,10bits的編號顯然太短了,經計算,我們至少需要32bits來表示所有的位元組位址編號,因此乙個資料的位址就類似於:0110 1101 1100 0010 1101 1110 0101 1101,由於寫起來太長不夠方便,因此我們更喜歡將上述位址表示為十六進製制:0x6dc2de5d。
記憶體這棟大樓的房間數多得驚人!他們的編號從0x00000000開始,到0xffffffff,總計達232個房間!每乙個房間(位元組/byte)包含8個位元/bit,每個位元可以存放乙個1或者0,一圖頂萬言,附上一張記憶體的****:
上圖展現了乙個32位系統的記憶體示意圖,第0x0804ffb0號位元組裡面存放了一串資料:1111 0000,而緊挨著他的第0x0804ffb1號位元組裡面存放了另一串資料:1010 1010。
看明白了沒有?之所以指標是4位元組,是因為在32位系統中。
而對於此處之所以列印出2,是因為使用的是64位作業系統,此時指標佔的記憶體空間為8位元組了。
上圖可以看出,不管是char型別,還是int型別的指標,64位作業系統中都是8個位元組。另外注意:64位系統只能安裝在64位電腦上(cpu必須是64位的),同時需要安裝64位常用軟體以發揮64位(x64)的最佳效能。32位作業系統則可以安裝在32位(32位cpu)或64位(64位cpu)電腦上。如果32位作業系統安裝在64位電腦上,其硬體恰似「大馬拉小車」:64位效能就會大打折扣。 64位cpu gprs(general-purpose registers,通用暫存器)的資料寬度為64位,64位指令集可以執行64位資料指令,也就是說處理器一次可提取64位資料(只要兩個指令,一次提取8個位元組的資料),比32位(需要四個指令,一次提取4個位元組的資料)提高了一倍,理論上效能會相應提公升1倍。
至於為什麼是8位元組:在64位系統中,cpu會通過位址匯流排在2^64個位址中尋找其中的某乙個位址值的資料,所以8個位元組的指標就可以代表記憶體中任意位置的乙個位址值,所以指標佔8個位元組就足夠用了。可以參考微博
乙個事故引發的思考
今天線上服務出現了乙個事故,思考下這個事故,覺得有好幾個地方需要思考。1 對於前端而言,回滾的功能是必須的。前端介面出現了問題,第乙個應該想到的是將 回滾到乙個穩定版本。2 快取和資料庫的使用,需要注意乙個問題,當快取失效的時候,可能會有大併發的請求去訪問資料庫,這個時候資料庫會不會崩潰?如果這個時...
乙個案例引發的思考
今天下午,團隊開了乙個簡短的版本總結會。會上測試經理分析了乙個案例 某子程式在轉測試後發現不能被平台排程,原因是子程式的排程入口跟不符合平台規範。很明顯開發在轉測試前沒有充分自驗證,測試經理提出,後續對跟平台對接的子程式轉測試必須要有將子程式接入平台跑通後的驗證報告和相關checklist,否則不予...
因乙個delete引發的思考
請看這樣一段 class test test volatile int m value int main int argc,char ar 請問這段 如何輸出?可能會有人回答崩了呀,然而實驗多次,程式依舊堅挺,輸出也正確,為啥呢?我們最主要的問題就在於delete到底做了什麼,釋放記憶體導致是怎麼釋...