<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      區塊鏈初探

      區塊鏈[&比特幣]概念

      拜占庭問題:討論如何在遠程協商且有干擾信息的情況下整個系統達成正確決策的問題。 拜占庭將軍問題深入探討 。一般地,把故障(不響應)的情況稱為“非拜占庭錯誤”,惡意響應的情況稱為“拜占庭錯誤”,對應的節點稱為拜占庭節點。設總節點數N,故障節點f,PBFT場景需滿足N>=3f+1;所以在prepare和commit兩個階段必須收到至少2f+1(包括自己) 個節點的消息,才可認為多于故障和惡意節點正常節點發回了響應,并有消息至少占據f+1數量的節點,從而達成共識。——注意,達成共識并不表示最終結果的正確性,而是只要得出這個最終結果即可。

      兩軍問題:信道的不可靠(信息存在被篡改和丟失的可能)使得兩軍問題無解。

      倘若1號藍軍(簡稱1)向2號藍軍(簡稱2)派出了通信兵,若1要知道2是否收到了自己的信息,1必須要求2給自己傳輸一個回執,說“你的信息我已經收到了,我同意你提議的明天早上10點9分準時進攻”。然而,就算2已經送出了這條信息,2也不能確定1就一定會在這個時間進攻,因為2發出的回執1并不一定能夠收到。所以,1必須再給2發出一個回執說“我收到了”,但是1也不會知道2是否收到了這樣一個回執,所以1還會期待一個2的回執。雖然看似很可笑,但在這個系統中永遠需要存在一個回執,這對于兩方來說都并不一定能夠達成十足的確信。更要命的是,我們還沒有考慮,通信兵的信息還有可能被篡改。

      這有點類似于《三體》里的猜疑鏈,除非我們/文明之間如三體人一樣可以敞開心扉無障礙交流(可靠信道)。

      不幸的是,兩軍問題作為現代通信系統中必須解決的問題,我們尚不能將之完全解決,這意味著你我傳輸信息時仍然可能出現丟失、監聽或篡改的情況。但我們能不能通過一種相對可靠的方式來解決大部分情形呢?這需要談到TCP協議。事實上,搜索“兩軍問題與三次握手”,您一定可以找到大量與TCP協議相關的內容。TCP協議中,A先向B發出一個隨機數x,B收到x了以后,發給A另一個隨機數y以及x+1作為答復,這樣A就知道B已經收到了,因為要破解隨機數x可能性并不大;然后A再發回y+1給B,這樣B就知道A已經收到了。這樣,A和B之間就建立一個可靠的連接,彼此相信對方已經收到并確認了信息。而事實上,A并不會知道B是否收到了y+1;并且,由于信道的不可靠性,x或者y都是可能被截獲的,這些問題說明了即使是三次握手,也并不能夠徹底解決兩軍問題,只是在現實成本可控的條件下,我們把TCP協議當作了兩軍問題的現實可解方法。

      FLP Impossibility:可參看FLP Impossibility,文中比較難以理解的是——F0屬于D,因為D是”確定“的,E0是0-valent的,無論E0從F0可達,還是F0從E0可達,則F0必定是0-valent的——“確定”即表示后續能且只能做出一個決議,因為E0是0-valent,若E0從F0可達(即E0是F0的后續),那么F0不能演化出1-valent,也就是說F0自身不能是1-valent(若F0是1-valent,那么任意事件e應用到失效的p上,結果還是1-valent,這將反推得D是“不確定”的);F0從E0可達同理。

      Diffie-Hellman算法可以使得在不安全信道上安全的交換密鑰,亦是非對稱加密算法的開端。

      普遍大家都認為公鑰密碼體制是迪菲(W.Diffie)和赫爾曼(E.Hellman)發明的,可鮮為人知的是,默克勒(R.C.Merkle)甚至在他倆之前的1975年就提出了類似的思想,盡管其文章是于1978年發表的,但投稿比較早。因此,公鑰密碼體制的創始人應該是他們三人。 當然,他們三人只是提出了一種關于公鑰密碼體制與數字簽名的思想,而沒有真正實現。不過,他們確實是實現了一種體現公鑰密碼體制思想、基于離散對數問題的、在不安全的通道上進行密鑰形成與交換的新技術。

      比特幣的方式每秒可以處理多少筆交易?最理想狀態下,平均每筆交易225 字節。在1M區塊限制下,一般平均10分鐘可以打包大約 4400 筆交易。每秒大約7.3筆交易,實際交易平均大小是這個的一倍,那么容量減半,也就是每秒大約 3.6 筆交易。

      一筆交易的可讀格式如下:

       1 {
       2   "version": 1,
       3   "locktime": 0,
       4   "vin": [
       5     {
       6       "txid":"7957a35fe64f80d234d76d83a2a8f1a0d8149a41d81de548f0a65a8a999f6f18",
       7       "vout": 0,
       8       "scriptSig": "3045022100884d142d86652a3f47ba4746ec719bbfbd040a570b1deccbb6498c75c4ae24cb02204b9f039ff08df09cbe9f6addac960298cad530a863ea8f53982c09db8f6e3813[ALL] 0484ecc0d46f1918b30928fa0e4ed99f16a0fb4fde0735e7ade8416ab9fe423cc5412336376789d172787ec3457eee41c04f4938de5cc17b4a10fa336a8d752adf",
       9       "sequence": 4294967295
      10     }
      11  ],
      12   "vout": [
      13     {
      14       "value": 0.01500000,
      15       "scriptPubKey": "OP_DUP OP_HASH160 ab68025513c3dbd2f7b92a94e0581f5d50f654e7 OP_EQUALVERIFY OP_CHECKSIG"
      16     },
      17     {
      18       "value": 0.08450000,
      19       "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG",
      20     }
      21   ]
      22 }

      交易手續費:一筆交易設置了輸入輸出(UTXO),若輸出總額小于輸入總額,那么差額就作為手續費給到[打包到區塊中的]礦工。因此,礦工會優選手續費大的交易;且由于區塊大小一定,若一個交易有很多個輸入輸出(如以非常多的小額輸入匯總到一個輸出),即該筆交易數據size較大,礦工也許會比較該筆交易的手續費與多筆小size的交易手續費之和的大小。總之,除挖礦獎勵的比特幣外,礦工都會希望自己挖到的區塊記錄的交易有更多的手續費。若鏈上交易頻繁,那些手續費少或者為0的交易甚至都不會被記錄,從而得不到確認。

      在手動創建交易時,務必注意輸入、輸出的值,非常容易犯錯的是忘記構造找零輸出。曾經有人構造交易時忘記找零,發生了支付 200 BTC 的礦工費的人間慘劇,所幸的是收錄該筆交易的Block由著名挖礦團隊“烤貓(Friedcat)”挖得,該團隊非常厚道的退回了多余費用

      比特幣的交易驗證引擎依賴于兩類腳本來驗證比特幣交易:鎖定腳本(上述代碼scriptPubKey)和解鎖腳本(上述代碼scriptSig)。鎖定腳本是輸出的一個字段,而解鎖腳本是輸入的一個字段,解鎖的是上筆輸出的鎖定腳本。可以理解為解鎖腳本作為參數傳入鎖定腳本,若最終得到的結果為true,那么表示該鎖定腳本關聯的交易輸出可以作為該解鎖腳本關聯的交易輸入,即能提供正確的解鎖腳本的賬號才可使用鎖定腳本鎖定的輸出。礦工亦是據此驗證一個交易是否成立。上述腳本格式為P2PKH——支付到公鑰地址模式(還有P2SH,支付到腳本模式,使用多重簽名就需要用到這種模式),在P2PKH模式下,scriptSig格式為[簽名的字節數][簽名]0×01 [公鑰的字節數] [公鑰],scriptPubKey格式為OP_DUP OP_HASH160 (0×14) [一個20字節的哈希值] OP_EQUALVERIFY OP_CHECKSIG

      我們可以查看上述交易的前一筆交易的輸出:

      1 "vout": [
      2    {
      3      "value": 0.10000000,
      4      "scriptPubKey": "OP_DUP OP_HASH160 7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8 OP_EQUALVERIFY OP_CHECKSIG"
      5    }
      6  ]

      第4行的20字節的16進制串7f9b1a7fb68d60c536c2fd8aeaa53a8f3cc025a8是收款方的地址,乃是收款方公鑰經過二次hash后得到的。

      為什么不直接使用公鑰呢,這是出于安全考慮。我們知道,可以從私鑰輕松地得到公鑰,反之則非常困難。雖然通過公鑰很難得到私鑰,但為了將風險降到最低,在交易過程中,我們可以將公鑰hash之后作為收款地址發給對方;更進一步,比特幣轉賬每次都是徹底把原來賬戶中的幣全部轉走(除非一個賬戶付款給自己,如找零),因此只要我不重復使用同一個公鑰,用完就扔掉,就不用擔心別人拿到我的公鑰后能干啥:如果高手不能很快的在我發布交易后根據里面的公鑰算出私鑰,一旦交易完成,公鑰對應的就是一個空賬戶了。

      交易驗證過程簡單地說就是:

      1. 把scriptSig中的公鑰同樣經過二次hash后得到的數據與前一筆交易的scriptPubKey的哈希值比對,若相等則說明公鑰有效;
      2. 使用公鑰解密scriptSig中的簽名,得到的結果若與當初私鑰簽名的內容(目前比特幣采用的是當前交易的全部or部分數據,取決于SIGHASH標志字節,scriptSig中指定)相同,則交易有效[,不考慮其它非法情況比如交易輸出>輸入](礦工便可將該交易打包)。

      一般錢包會使用SIGHASH_ALL標志(0x01)進行簽名,表示Signature applies to all inputs and outputs。指定不同的SIGHASH標志可以實現特殊的業務場景,比如ALL|ANYONECANPAY(0x81,Signature applies to one input and all outputs)可以實現某種眾籌形式:試圖籌集資金的人可以用單筆輸出來構建一個交易,單筆輸出將“目標”金額付給眾籌發起人。這樣的交易顯然是無效的,因為它沒有輸入。但是現在其他人可以通過添加自己的輸入作為捐贈來修改它,他們用ALL | ANYONECANPAY簽署自己的輸入,除非收集到足夠的輸入以達到輸出的價值,否則交易[數據]無效,可以把每次捐贈看作是一項“抵押”,直到募集到整個目標金額募款人才能真正收取(即將交易數據發送到比特幣網絡,滿足輸入>=輸出才能被礦工打包記錄)。

      在簽名過程中,會先 generates an ephemeral (temporary) private public key pair。為何要另外生成一對臨時密鑰對,而不使用已有的公私鑰,現在我還沒理解進去。

      私鑰就是一個隨機選出的數字。比特幣私鑰空間的大小是2^256,這是一個非常大的數字。用十進制表示的話,大約是10^77,而可見宇宙被估計只含有10^80個原子。

      通過橢圓曲線乘法可以從私鑰計算得到公鑰,這是不可逆轉的過程:K = k * G 。其中k是私鑰,G是被稱為生成點的常數點,而K是所得公鑰。比特幣使用了secp256k1標準所定義的一種特殊的橢圓曲線和一系列數學常數,所有比特幣用戶的生成點是相同的。

      公鑰的格式:按是否壓縮可分為非壓縮格式和壓縮格式。我們知道,公鑰是在橢圓曲線上的一個點,由一對坐標(x,y)組成。非壓縮公鑰通常表示為前綴04緊接著兩個256比特的數字,組成格式為04 x y共520bit。引入壓縮格式公鑰是為了減少比特幣交易的字節數,從而可以節省那些運行區塊鏈數據庫的節點磁盤空間——壓縮格式只存儲公鑰的x坐標值,y坐標可以通過解橢圓曲線的方程求得,前綴02/03分別對應y是偶數/奇數的情況。

      為了存儲安全,私鑰有必要再次加密。BIP0038提出了一個通用標準,使用一個[強]口令加密私鑰并使用Base58Check對加密的私鑰進行編碼。這樣就算別人獲得了你的私鑰(加密過的),但不知道口令[密碼]依然無用。

      P2P網絡

      當一個節點(如比特幣錢包客戶端)啟動后,如何加入到比特幣網絡中呢,即怎樣才能與已在比特幣網絡中的節點建立連接。一種方式是通過已知的DNS服務器,這些DNS服務器提供比特幣節點的IP地址列表;或者指定至少一個已知的比特幣節點的IP地址。目前你還不能期望一個孤獨的節點連入Internet后自己能很快尋找到其它的比特幣節點。

      SPV指的是“支付驗證“,而不是“交易驗證”。這兩種驗證有很大區別。
      “交易驗證”非常復雜,涉及到驗證是否有足夠余額可供支出、是否存在雙花、腳本能否通過等等,通常由運行完全節點的礦工來完成。
      “支付驗證”則比較簡單,只判斷用于“支付”的那筆交易是否已經被驗證過(已經被礦工打包),并得到了多少的算力保護(多少確認數)。這里涉及到Merkle Tree的概念,將數據塊分段hash,然后相鄰兩段[或多段]的hash拼接后再hash,最終得到一個根hash,這樣就組成了一棵Merkle Tree。我們可以依靠它校驗局部數據,而不需要對整個數據塊進行校驗,參看 大話Neo系列:Merkle Tree。 

      哈希算法在比特幣中的應用幾乎是方方面面,主要包括SHA256和RIPEMD160,比特幣將這兩個哈希算法的應用組合成兩個函數:hash256(d)=sha256(sha256(d))和hash160(d)=ripemd160(sha256(d)),其中d為待哈希的字節數組,兩者分別生成256位(32字節)和160位(20字節)的16進制數值。hash256主要用于生成標志符,如區塊ID,交易ID等,而hash160主要用于生成比特幣地址。
      值得一提的是,為什么兩個函數都是做兩次哈希呢?對于hash160比較認同的答案是ripemd160可以使得生成的地址更短,但是只做ripemd160一次哈希可能會存在安全漏洞所以同時使用sha256起到安全加固;至于hash256使用兩次sha256哈希算法的原因來源于sha1算法,由于一次sha1哈希存在被生日攻擊(birthday attack)的風險,所以當使用sha1運算時一種有效方式就是做兩次sha1哈希,sha256本身并不存在生日攻擊漏洞,但是防御性的使用兩次sha256哈希借鑒于sha1.

       

      參考資料:精通比特幣(第二版) 英文原版:https://github.com/bitcoinbook/bitcoinbook


      涉及到的部分數學知識

      \(a\equiv b\pmod{c}\):a和b除以c后余數相同。

      線性同余方程:\(ax\equiv b\pmod{n}\),當且僅當b能夠被a與n的最大公約數整除(記作gcd(a,n) | b)時,此方程有解。這時,如果 x0 是方程的一個解,那么所有的解可以表示為:{x0+kn/d|(k∈z)},其中 d 是a 與 n 的最大公約數。在模 n 的完全剩余系 {0,1,…,n-1} 中,恰有 d 個解。例如,在方程5x ≡ 2 (mod 6)中, d = gcd(5,6) = 1,1 整除 2,因此方程在{0,1,2,3,4,5} 中恰有一個解: x=4。

      對于[一元]線性同余方程組,中國剩余定理給出了有解的判定條件,并用構造法給出了在有解情況下解的具體形式。

      原根:如果 a 與 n 是互質的整數且n>0,那么當\(ord_na=\varphi(n)\)時,稱a為模n的原根。若a是n的原根,那么\(a^i \bmod n,其中(i\in[1,n-1],a\in[2,n-1])\)的結果互不相同。也可從另個方面理解,P為素數,i、j為整數,其中\(i \ne j, 且 i,j \in [1,P-1]\),若對于滿足上述條件的任意i、j,有\(g^i \bmod P \ne g^j \bmod P\),則 g 就是 P 的原根。

      更多階與原根的知識可參看 數論之原根

      Diffie-Hellman算法:一種秘鑰交換算法,它是一種建立秘鑰的方法,而不是加密方法,這種秘鑰交換技術的目的在于使兩個用戶安全的交換一個秘鑰。按上述原根的性質,可知如果a是素數p的一個原根,那么數值\(a \bmod p,a^2 \bmod p,\cdots,a^{p-1} \bmod p\) 是各不相同的整數,并且以某種排列方式組成了從1到p-1的所有整數。可參看 Diffie-Hellman(迪菲-赫爾曼)秘鑰交換

      涉及引理:若\(a \bmod b \equiv n\),則\(a^k \bmod b \equiv n^k \bmod b\)。

      證明:

      因為\(a \bmod b \equiv n\),則必然存在唯一整數q使得 a=qb+n (帶余除法基本原理)

      于是\(a^k=(qb+n)^k\),將\((qb+n)^k\)二項式展開,可以發現展開項除\(n^k\)外,其余項b的次數都大于零,可得除以b的余數必然由\(n^k\)這一項產生

      所以\(a^k \bmod b \equiv n^k \bmod b\),證畢

      RSA加密算法:參看 阮一峰:RSA算法原理(一)RSA算法原理(二)


      其它

      復式記賬法:Asset(資產) = Liability(負債) + Equity(股東權益)。等式左邊可理解為[公司]債務,右邊可理解為[股東和其他投資方的]債權,可以理解為公司本身是沒錢的,公司賺的錢都是屬于股東的。

      個人理解,一個好處是便于數據的統計匯總,它將一筆經濟業務格式化為借&貸。借表示資金目前的狀態,貸表示資金的來源。整個借貸分錄,描述出一筆經濟業務的資金運行情況,包括了業務種類(即會計科目)、涉及金額和資金運行方向,也就是用會計的語言描述了一筆經濟業務。這比純語言記錄如“老李借給我100塊錢”更規范,也便于工具[&自己]匯總對賬。

      另一個角度理解復式記賬法,可以建立一個“主體觀”,要明白記賬的“主體”是什么?記賬的主體是“公司”,不是股東,也不是債權人(這就是公司的法人獨立性)。所以資源流入的時候,公司資產增加。但是“公司” 是屬于股東的,公司有一部分資產也是屬于債權人的,所以每一筆資源流入,必然對應股東權益增加,或者債權人債權增加(不考慮資產內部互轉等情況);流出亦然。也就是說,公司每一筆業務導致的資源(財、物)流動,復式記賬法不僅給“主體”做了登記,還給資源的歸屬做了登記。為什么要這么復雜?因為公司法人獨立,公司資產與股東財產分離,才能做到公司債務與股東責任分離。公司可以破產,因為經營的主體是“公司”而非股東個人,所以股東不必“賣房賣車賣兒賣女”的去還債;所以股東雖然是公司所有者,但是非法挪用公司財產照樣是犯罪。這個“主體觀”,不僅可以幫助理解復式記賬法,還是以后學習更復雜的企業合并、報表合并、股權投資核算的有力工具。[來自知乎,相關問題:復式記賬(復式簿記)的基本原理是什么?]

      通貨膨脹導致貨幣緩慢但不可避免的貶值,這是一種隱性稅收的形式,懲罰在銀行存錢的人從而實現解救債務人(包括政府這個最大的債務人)。 政府控制下的貨幣容易遭受債務發行的道德風險,之后可能會以犧牲儲蓄者為代價,通過貶值來抹去債務。

      以太坊全節點中,都保存有完整的區塊鏈數據。以太坊不僅將交易數據保存在鏈上,編譯后 的合約代碼同樣也保存在鏈上,同時其還提供了一個虛擬機來執行合約代碼。感性認識:深入解析調用合約的三種方法序列8 智能合約能自動觸發嗎?-智能合約平臺的本質

      一般情況下,DApp還是需要中心服務器,用于同區塊鏈/以太坊節點交互,非用戶數據存儲在本地,用戶數據保存在鏈上。若有成千上萬個DApp運行在主鏈上,將在計算和存儲兩方面對主鏈產生壓力,可使用側鏈架構,即每一個Dapp就是一條側鏈,側鏈可以有相對獨立的區塊鏈和節點網絡,不同DApp之間互不影響,更合理。

      寄存器是中央處理器內的組成部份。它們可用來暫存指令、數據和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器(ACC)。

      堆棧:堆和棧是兩種內存分配的兩個統稱,可能有很多種不同的實現方式。每種語言針對其有基本的設計原則,如棧通常后進先出(LIFO)。堆都是動態分配的,沒有靜態分配的堆。棧有兩種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如局部變量的分配;棧的動態分配和堆是不同的,他的動態分配是由編譯器進行釋放,無需我們手工實現。棧是機器系統提供的數據結構,計算機會在底層對棧提供支持,分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。棧通常用于存取函數參數值、局部變量值以及指令地址等,主要保證邏輯按預期順序執行;而堆簡單的多,只是用于數據的存取。理解堆棧的概念還是得從早期的硬件和語言歷史回顧,隨著計算機技術的發展,這兩者在軟硬件的層面,在不同場景下都有不同的體現。C/C++中的變量存儲類別以及內存分配 

      指令系統分成堆棧型和寄存器型。不光這兩種,指令系統共有四種分類,堆棧型,累加器型,寄存器-存儲器型和寄存器-寄存器型。分類的依據是操作數的來源。堆棧型默認的操作數都在棧頂,累加器型默認一個操作數是累加器,寄存器-存儲器型的操作數可以是寄存器或者內存,寄存器-寄存器型除了訪存指令,操作數都是寄存器。

      進程,線程,協程:進程和線程大家很熟悉。進程擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,進程由操作系統調度;線程擁有自己獨立的棧,共享堆,不共享棧,線程亦由操作系統調度;協程主要是針對單線程的一個概念(如Js、NodeJs、Python由于GIL導致的偽多線程),常用的一個場景是IO阻塞時,程序控制線程不傻傻等待,而是去執行其它任務,等IO操作完畢再控制線程回來繼續操作,由于是單線程,所以也不涉及到由于系統調度導致的性能損耗。在編程層面上來說,協程的概念偏向于已同步編程的模式實現異步處理的編程模式,避免了多層回調代碼嵌套的問題。協程的模式容易讓人聯想到C#的await/async,其實兩者雖然解決的問題差不多,但是C#是多線程,若回調到達時,之前的線程仍在忙其它事情,線程池完全可以派另外的線程處理后續步驟,雖然多了線程上下文(主要是棧數據,刷新寄存器)切換的開銷,但不用死等之前線程。參考資料 事件驅動與協程:基本概念介紹 (雖然其中內容不太準確,但是意思到位了)。

      多個協程對應到一個線程才有意義,就如同一個進程包含多個線程。一個cpu內核同一時間只能執行一個進程/線程,因此在一個內核上的多線程執行其實效率反而比串行執行低,只是給用戶一種并發的錯覺;協程也同理,雖然貌似多個協程并行執行,其實最終還是落到一個線程上,不過比掩耳盜鈴的多線程切換要省時省力(無需切換線程,省去了內核調度),并發的感覺上似乎也更加快了。當然多個協程可以對應到多個線程,特別是在當前多核cpu場景下,一般協程數多于線程數才有使用協程的意義。Go語言中的Goroutine可看作協程的一種實現,參看:理解Goroutine

      指針:

      void Add(int * a)   // a 是一個int型的指針,a指的地址存放的是int型的數據
      {
        a    // 取指針a的值(即其指向內容的地址)
        *a   // 取指針a指向的內容
        &a   // 取存放指針a的值的地址
      }

      為什么會有指針。從廣義上講,在編碼時,我們也可以認為普通變量是指向具體內存的指針,但是代碼編譯后變量名會被替換為[虛擬]內存地址或者各種寄存器,所以變量只是給程序員編程時操作數據用的,但是有時我們需要操作的是數據所在的內存地址,這個時候普通的變量就沒辦法了,于是有了我們平常所說的指針的概念。

      C++還有引用的概念,可以理解為一個變量的別名,指向同一塊內存(即使用引用不會創建對象副本),主要用在方法參數和返回值。不同于C#,C#一開始就在底層區分了值類型和引用類型,而C++傳遞變量名默認就是值傳遞(不管是什么數據類型)。很多人對指針和引用傻傻分不清,雖然指針也可以實現引用的功能(畢竟指針直接操作內存地址,你說啥功能實現不了),但是引用更符合它所代表的使用場景。

      vector:C++中的一種數據結構,一般作為動態size的數組使用。vector的擴充機制:按照容器現在容量的一倍進行增長。 vector容器分配的是一塊連續的內存空間,每次容器的增長,并不是在原有連續的內存空間后再進行簡單的疊加, 而是重新申請一塊更大的新內存,并把現有容器中的元素逐個復制過去,然后銷毀舊的內存。 這時原有指向舊內存空間的迭代器已經失效,所以當操作容器時,迭代器要及時更新。

       
      其它資料:
      posted @ 2018-06-28 14:42  萊布尼茨  閱讀(844)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品亚洲二区在线播放| www内射国产在线观看| 丁青县| av无码久久久久不卡网站蜜桃| 日韩国产精品中文字幕| 亚洲综合伊人久久综合| 在线成人| 91精品国产午夜福利| 万年县| 精品少妇人妻av无码专区| 国产超碰无码最新上传| 全部免费毛片在线播放| 久久热这里只有精品99| 亚洲精品一区二区制服| 真人作爱90分钟免费看视频| 强奷乱码中文字幕| 亚洲情A成黄在线观看动漫尤物| 精品无码国产污污污免费| 国产成人午夜福利在线播放| 国产成人亚洲综合图区 | 91精品乱码一区二区三区| 体育| 国产午夜精品福利91| 精品视频福利| 国产亚洲精品超碰热| 夜鲁夜鲁很鲁在线视频 视频| 欧美乱码精品一区二区三区| 色一情一乱一区二区三区码| 婷婷四房播播| 中文字幕乱码视频32| 色综合久久一区二区三区| 强奷漂亮人妻系列老师| 色一情一区二区三区四区| 激情四射激情五月综合网| 亚洲欧美日韩在线码| 通州区| 国产精品一区二区性色av| 国产在线乱子伦一区二区| 天天躁日日躁狠狠躁中文字幕| 97国产精品人人爽人人做| 精品一区二区三区在线观看l|