讀《深度探索 C++ 對(duì)象模型》

前言

這本書是之前京東做活動(dòng)買的很多本書中的一本(主要閱讀時(shí)間是周末裸扶、每天早上起來吃早餐的時(shí)候,以及下班回來時(shí)候优床,前后花了一個(gè)月左右吧)蛤售。

C++ 只是在大一下的時(shí)候大量使用過,之后就沒怎么用過 C++ 了喂江。起初以為看這本書可能比較吃力召锈,因?yàn)榍把哉f目標(biāo)讀者是 C++ 有經(jīng)驗(yàn)的人。但是看的時(shí)候感覺沒那么難懂获询,基本上寫到的東西都能理解涨岁。

此書應(yīng)該是上世紀(jì)末成書的,書中的內(nèi)容可能有些過時(shí)了(比如內(nèi)存布局)吉嚣,但是仍然是值得一看的書梢薪。總體上感覺就是:為了程序員寫代碼尝哆,同時(shí)又為了保證程序語意等的正確和執(zhí)行期的效率秉撇,編譯器為我們做了很多事情。

這里我對(duì)每一章內(nèi)容都寫一下我的一些總結(jié)和想法秋泄,由于是看完全書以后才寫的琐馆,前面很多內(nèi)容其實(shí)有些忘了(??),盡量憑回憶和粗略的回看總結(jié)一下恒序。瘦麸。。

關(guān)于對(duì)象

本書第一章講的是對(duì)象歧胁。

c++ 的對(duì)象(類)使用其實(shí)是非常高效的滋饲,這里的高效指的是:對(duì)于 C,C++ 大部分簡單類的屬性存取操作其實(shí)是和 C 一樣高效的喊巍。其他語言沒有 C++ 高效有一部分原因是其存取可能涉及到很多間接內(nèi)存操作屠缭,而 C/C++ 大部分存取操作可能只會(huì)涉及到一次內(nèi)存讀寫。

C++ 帶來比 C 低效的大部分原因是要支持 virtual 機(jī)制:

  1. 虛函數(shù)
  2. 虛繼承

什么是對(duì)象模型玄糟?我的理解是語言本身是如何處理類的內(nèi)存分布的策略勿她,由于現(xiàn)在大部分語言支持 OOP 編程,該策略一個(gè)關(guān)注點(diǎn)就是如何實(shí)現(xiàn)繼承阵翎,還有語言本身的其他涉及到內(nèi)存分布的特性逢并,比如虛函數(shù)、虛繼承郭卫、多重繼承砍聊、RTTI 的支持等。

書中列舉了幾個(gè)可能的對(duì)象模型:

  1. 簡單對(duì)象模型
  2. 表格驅(qū)動(dòng)對(duì)象模型
  3. C++對(duì)象模型(被具體實(shí)現(xiàn)的模型)

關(guān)于對(duì)象模型優(yōu)劣的角度主要有:

  1. 間接性是否足夠少(越少內(nèi)存訪問越快贰军,帶來的問題是靈活性不足)
  2. 對(duì)象的可拓展性(這是我自己加的玻蝌,主要指的是蟹肘,如果基類發(fā)生變化,子類是否需要重新編譯)

構(gòu)造函數(shù)語意學(xué)

這一章講的是 C++ 的構(gòu)造函數(shù)相關(guān)內(nèi)容俯树。

默認(rèn)構(gòu)造函數(shù)帘腹。

一個(gè) C++ 類程序員可以不定義其構(gòu)造函數(shù),但是在有必要的情況下许饿,編譯器會(huì)自動(dòng)幫助我們合成一個(gè)構(gòu)造函數(shù)阳欲,雖然有時(shí)候這個(gè)構(gòu)造函數(shù)可能并沒有什么用。

為什么默認(rèn)構(gòu)造函數(shù)是必須的(如果程序員不顯式的定義一個(gè)構(gòu)造函數(shù))陋率?

  1. 當(dāng)當(dāng)前類定義包含一個(gè)成員對(duì)象球化,該成員對(duì)象有一個(gè)默認(rèn)構(gòu)造函數(shù),那么編譯器會(huì)為當(dāng)前類合成一個(gè)默認(rèn)構(gòu)造函數(shù)瓦糟,然后在該函數(shù)內(nèi)部調(diào)用成員對(duì)象的默認(rèn)構(gòu)造函數(shù)筒愚。
  2. 當(dāng)當(dāng)前定義的類是另一個(gè)類的子類,父類有一個(gè)默認(rèn)構(gòu)造函數(shù)菩浙,那么編譯器也會(huì)生成一個(gè)默認(rèn)構(gòu)造函數(shù)巢掺,在該函數(shù)內(nèi)部調(diào)用父類的默認(rèn)構(gòu)造函數(shù)。
  3. 當(dāng)當(dāng)前類帶有虛函數(shù)的時(shí)候芍耘,編譯器需要設(shè)定好虛函數(shù)表和虛函數(shù)表指針址遇。
  4. 當(dāng)當(dāng)前類虛繼承于另外一個(gè)類。

如果不是上述這四種情況斋竞,是否合成默認(rèn)構(gòu)造函數(shù)是可有可無的倔约。默認(rèn)構(gòu)造函數(shù)的合成是出于編譯器的角度。而且默認(rèn)構(gòu)造函數(shù)中編譯器關(guān)注的內(nèi)容主要是成員對(duì)象的初始化坝初,內(nèi)建類型(也就是基本類型)的初始化是程序員的責(zé)任浸剩。

拷貝構(gòu)造函數(shù)

有三種情況需要拷貝構(gòu)造函數(shù):

  1. 顯式的將一個(gè)對(duì)象賦值給另一個(gè)對(duì)象
  2. 將對(duì)象作為參數(shù)傳遞
  3. 將對(duì)象作為函數(shù)返回值返回

程序員可以不定義或者定義一個(gè)拷貝構(gòu)造函數(shù),當(dāng)不定義的時(shí)候鳄袍,默認(rèn)的拷貝構(gòu)造函數(shù)行為是按成員從當(dāng)前對(duì)象拷貝到另一個(gè)對(duì)象上的绢要。如果某個(gè)成員帶有一個(gè)顯式定義的拷貝構(gòu)造函數(shù)的話,編譯器就需要為我們合成一個(gè)拷貝構(gòu)造函數(shù)拗小,在函數(shù)內(nèi)部調(diào)用該成員的顯式拷貝構(gòu)造函數(shù)重罪。否則,編譯器就不需要為我們合成拷貝構(gòu)造函數(shù)哀九。

所以什么情況下編譯器必須為我們合成一個(gè)拷貝構(gòu)造函數(shù)剿配?(如果程序員不顯式的定義一個(gè)拷貝構(gòu)造函數(shù))

  1. 當(dāng)前類中某個(gè)成員對(duì)象定義(或者編譯器為它合成)了一個(gè)拷貝構(gòu)造函數(shù)
  2. 當(dāng)前類繼承的父類定義了一個(gè)拷貝構(gòu)造函數(shù)
  3. 當(dāng)前類有虛函數(shù)
  4. 當(dāng)前類虛繼承與另外一個(gè)類

1和2比較簡單,編譯器簡單的將成員對(duì)象和父類的拷貝構(gòu)造函數(shù)插入到合成的拷貝構(gòu)造函數(shù)中即可阅束。

對(duì)于3呼胚,當(dāng)將一個(gè)子類賦值給父類的時(shí)候,如果父類含有虛函數(shù)息裸,那么不能簡單的將子類的 vptr 賦值給父類對(duì)象蝇更,否則當(dāng)父類對(duì)象虛函數(shù)調(diào)用的時(shí)候會(huì)執(zhí)行子類的虛函數(shù)(這里沒有多態(tài))沪编。所以編譯器合成的拷貝構(gòu)造函數(shù)要合理的設(shè)置 vptr 為父類的 vtable。(即使在程序員顯式的定義了一個(gè)拷貝構(gòu)造函數(shù)年扩,vptr 的指定也是靠編譯器來完成蚁廓,因?yàn)?vptr 對(duì)于程序員是透明的)

對(duì)于4,由于虛繼承的特殊性常遂,編譯器要很仔細(xì)的幫助我們處理子類對(duì)象賦值給父類對(duì)象這種情況纳令,以便合理的設(shè)置父類對(duì)象的某些值。

程序轉(zhuǎn)換語意學(xué)

這一部分主要是為了告訴我們克胳,在用到構(gòu)造函數(shù)的地方,編譯器為我們的代碼做的轉(zhuǎn)換圈匆,主要是確保默認(rèn)構(gòu)造函數(shù)漠另、拷貝構(gòu)造函數(shù)或者顯式定義的構(gòu)造函數(shù)們被正確的調(diào)用。主要從函數(shù)返回值跃赚、函數(shù)參數(shù)笆搓、初始化等幾個(gè)角度討論。

接著討論如何優(yōu)化編譯器的轉(zhuǎn)換代碼纬傲。比如 NRV 優(yōu)化满败,主要是為了盡量避免多余的構(gòu)造函數(shù)的調(diào)用。

成員對(duì)象的初始化列表

為了避免構(gòu)造函數(shù)中多余的成員對(duì)象和臨時(shí)對(duì)象的構(gòu)造函數(shù)的調(diào)用叹括,一種比較好的方法是使用初始化列表算墨。但是要注意,初始化列表中的初始化順序不是按照程序員寫的順序執(zhí)行的汁雷,而是按照成員被聲明的順序初始化的净嘀。

成員初始化列表最終會(huì)被編譯器所轉(zhuǎn)換,注入到用戶定義的構(gòu)造函數(shù)的代碼內(nèi)容的最前面侠讯。

Data 語意學(xué)

這一章講解的是類中的數(shù)據(jù)挖藏。一個(gè)類的大小可以使用 sizeof 來取得。決定類的大小有三個(gè)因素:

  1. 語言本身的額外負(fù)擔(dān)厢漩,比如為了支持虛函數(shù)調(diào)用機(jī)制膜眠,類的定義中會(huì)被安插一個(gè) vptr 指針。
  2. 某些特殊情況下編譯器的優(yōu)化溜嗜。比如空的虛繼承基類的大小可能會(huì)反應(yīng)到子類上宵膨。
  3. 內(nèi)存對(duì)齊的需要

類數(shù)據(jù)成員的綁定

類數(shù)據(jù)成員在類的成員函數(shù)中使用似乎不應(yīng)該存在太大問題。但是在早期的編譯器中卻是有問題的粱胜。比如類的成員函數(shù)在類數(shù)據(jù)成員定義之前用到了該數(shù)據(jù)成員柄驻,如果剛好在類定義外部有這么一個(gè)數(shù)據(jù),那么編譯器就要決議應(yīng)該使用的是類內(nèi)部的數(shù)據(jù)成員而不是外部的變量焙压。

數(shù)據(jù)成員的布局

類的靜態(tài)數(shù)據(jù)成員是被存放在類外部的鸿脓,不會(huì)影響到對(duì)象的內(nèi)存布局抑钟。非靜態(tài)數(shù)據(jù)成員的內(nèi)存布局依賴各個(gè)編譯器具體的實(shí)現(xiàn),C++ 標(biāo)準(zhǔn)并不加以限制野哭。類的另外一些對(duì)程序員透明的成員在塔,比如 vptr,它的位置是哪兒呢拨黔?編譯器可以放在類定義的最前端或者最后面蛔溃。編譯器也可以合理的組織不同訪問權(quán)限的(public、private篱蝇、protect)成員在各自的區(qū)域贺待。

數(shù)據(jù)成員的訪問

首先是靜態(tài)數(shù)據(jù)成員的訪問。由于靜態(tài)數(shù)據(jù)成員是存儲(chǔ)在程序的數(shù)據(jù)段中零截,無論是通過指針還是對(duì)象來訪問麸塞,這兩種方式訪問沒有任何效率或者其他實(shí)質(zhì)的區(qū)別。

如果有兩個(gè)類含有相同名字的靜態(tài)數(shù)據(jù)成員涧衙,由于靜態(tài)數(shù)據(jù)是存在數(shù)據(jù)段中的哪工,為了防止名字沖突,編譯器會(huì)進(jìn)行名字處理弧哎,也就是 name-mangling雁比。

其次是非靜態(tài)數(shù)據(jù)的訪問。在成員函數(shù)中訪問成員函數(shù)撤嫩,編譯器其實(shí)會(huì)做代碼上的一些轉(zhuǎn)換偎捎,將當(dāng)前this 對(duì)象作為函數(shù)的第一個(gè)參數(shù),函數(shù)中對(duì)成員數(shù)據(jù)的訪問是通過改 this 指針來完成的非洲。

繼承和數(shù)據(jù)成員

一般來說鸭限,子類的數(shù)據(jù)成員會(huì)被定義在父類的下面(當(dāng)然,這方面沒有絕對(duì)的要求)
在這一小節(jié)两踏,作者分兩個(gè)角度討論:

  1. 一個(gè)是繼承無多態(tài)
  2. 含多態(tài)的繼承
  3. 多重繼承
  4. 虛繼承

對(duì)于1败京,在編譯器設(shè)計(jì)實(shí)現(xiàn)的時(shí)候需要特別注意一個(gè)問題,就是對(duì)于為了內(nèi)存對(duì)齊所額外使用的空間的使用梦染。父類存在為了內(nèi)存對(duì)齊而多占用了幾個(gè)字節(jié)大小赡麦,如果子類是緊隨在父類之后的,并且為了節(jié)省空間考慮而將自己的數(shù)據(jù)成員填充到父類的內(nèi)存對(duì)齊的幾個(gè)字節(jié)中帕识,那么泛粹,在將一個(gè)父類對(duì)象賦值給子類對(duì)象的時(shí)候,父類對(duì)象的內(nèi)存對(duì)齊字節(jié)會(huì)覆蓋了子類對(duì)象的起始數(shù)據(jù)成員肮疗,這顯然是錯(cuò)誤的晶姊。

對(duì)于2,含多態(tài)的類的關(guān)注點(diǎn)是伪货,將 vptr 放在類對(duì)象的哪兒呢们衙?可以是開始钾怔,也可以是最后。

對(duì)于3蒙挑,多重繼承要關(guān)注的是如何正確的處理派生類實(shí)例和其第二個(gè)父類的轉(zhuǎn)換宗侦。答案是通過偏移量來處理。

虛擬繼承要解決的問題是多重繼承中可能存在的菱形繼承問題忆蚀。虛擬繼承的實(shí)現(xiàn)有兩種方式:

  1. 指針策略
  2. 虛函數(shù)表偏移策略

1是指矾利,通過附加一個(gè)每個(gè)虛擬繼承子類添加一個(gè)指向共享部分的一個(gè)指針。2是指馋袜,在虛函數(shù)表中放置虛擬繼承基類的偏移量

指向數(shù)據(jù)成員的指針

當(dāng)需要了解類中成員對(duì)象的底層內(nèi)存布局的時(shí)候男旗,使用這類指針會(huì)特別有用,因?yàn)檫@類指針取到的就是該數(shù)據(jù)成員在類模型中的偏移量欣鳖。

為了區(qū)分“沒有指向任何數(shù)據(jù)成員” 和指向第一個(gè)數(shù)據(jù)成員這兩種情況剑肯,所有的指針都會(huì)被加1,在具體使用的時(shí)候需要減1

函數(shù)語意學(xué)

非靜態(tài)成員函數(shù)

非靜態(tài)成員函數(shù)是如何實(shí)現(xiàn)的呢观堂?

  1. 編譯器會(huì)改寫該成員函數(shù)的簽名,安插一個(gè)額外的參數(shù)到函數(shù)中呀忧,也就是 this 指針师痕。
  2. 所有對(duì)非靜態(tài)成員數(shù)據(jù)的訪問都是通過 this 指針來完成的
  3. 該非靜態(tài)成員函數(shù)的名字會(huì)被 name mangling,使得它的名字在程序中是獨(dú)一無二的而账,又能反應(yīng)函數(shù)的簽名胰坟、所屬類等的信息

虛擬成員函數(shù)

虛擬成員函數(shù)是如何實(shí)現(xiàn)的呢?

  1. 每一個(gè)類對(duì)象中會(huì)又一個(gè) vptr 指針泞辐,用來指向存儲(chǔ)虛函數(shù)列表笔横。由于繼承體系的復(fù)雜,vptr 指針很有可能被 mangling
  2. 對(duì)虛函數(shù)的調(diào)用是通過 vptr 指針咐吼,和其中虛函數(shù)列表中的索引值來的吹缔。
  3. 在虛函數(shù)第一個(gè)參數(shù)位置傳遞調(diào)用者指針,也就是 this 指針
  • 在單一繼承體系中锯茄,每一個(gè)類對(duì)象如果有實(shí)現(xiàn)一個(gè)虛函數(shù)厢塘,則會(huì)重寫其 vptr 相應(yīng)索引值的來自直接基類的函數(shù)指針,使其指向自己的實(shí)現(xiàn)肌幽。
  • 在多重繼承體系中晚碾,虛擬函數(shù)的實(shí)現(xiàn)比較復(fù)雜。一種是調(diào)整 this 指針喂急,缺點(diǎn)是效率底下格嘁,解決方法是使用所謂的 thunk 函數(shù)。比較好的解決方法是用派生類中實(shí)現(xiàn)的虛函數(shù)指針重寫基類們的 vptr 對(duì)于索引值的值廊移。

靜態(tài)成員函數(shù)

靜態(tài)成員函數(shù)是如何實(shí)現(xiàn)的糕簿?

一個(gè)非靜態(tài)成員函數(shù)如果沒有用到非靜態(tài)成員變量的話探入,其實(shí)沒有必要讓它通過類實(shí)例來調(diào)用。但是如果類中存在一個(gè) nonpublic 的靜態(tài)成員函數(shù)冶伞,那么類必須提供成員函數(shù)來訪問它新症。解決之道是引入靜態(tài)成員函數(shù)。

靜態(tài)成員函數(shù)最大特點(diǎn)是沒有 this 指針响禽,所以它又如下特點(diǎn):

  1. 不能直接訪問類中的非靜態(tài)成員
  2. 不能被聲明為 const徒爹、 volatile 或者 virtual
  3. 不需要通過類實(shí)例來調(diào)用(雖然語法上可以,但是最終轉(zhuǎn)換的代碼并不需要類的實(shí)例)

靜態(tài)成員函數(shù)由于沒有 this 指針芋类,看起來很像是非成員函數(shù)隆嗅。

成員函數(shù)指針

  1. 非虛擬成員函數(shù)的指針實(shí)際上是函數(shù)在內(nèi)存中的指針
  2. 虛函數(shù)指針實(shí)際上是虛函數(shù)在虛函數(shù)表中的索引值
  3. 多繼承下的成員函數(shù)指針是一個(gè)結(jié)構(gòu)體,index侯繁、 faddr 和 delta胖喳。如果是非虛函數(shù),則 index 為 -1贮竟,否則 index 指的是虛函數(shù)表中的索引值丽焊。faddr 是非虛擬成員函數(shù)的內(nèi)存地址,delta 是一個(gè)可能的 this 指針調(diào)整值咕别。

內(nèi)斂函數(shù)

處理內(nèi)斂函數(shù)有兩個(gè)步驟:

  1. 根據(jù)復(fù)雜度分析函數(shù)是否可以被內(nèi)斂技健,若不能,則被轉(zhuǎn)換成靜態(tài)函數(shù)惰拱。
  2. 內(nèi)斂函數(shù)的擴(kuò)展是在調(diào)用的點(diǎn)上的雌贱。

內(nèi)斂函數(shù)的擴(kuò)展會(huì)帶來兩個(gè)問題:

  1. 參數(shù)求值
  2. 臨時(shí)對(duì)象管理

臨時(shí)對(duì)象管理一個(gè)可能的情況是內(nèi)斂函數(shù)的參數(shù)是另一個(gè)函數(shù)調(diào)用返回的值(基本類型或者類類型)。編譯器要正確的處理臨時(shí)對(duì)象的釋放問題偿短。

內(nèi)斂函數(shù)是 C 中的 #define 的一個(gè)安全替代欣孤,特別是宏有它的負(fù)作用。但是內(nèi)斂函數(shù)被使用太多的話昔逗,會(huì)產(chǎn)生大量的代碼降传,使得程序代碼增大。同時(shí)內(nèi)斂函數(shù)要管理可能產(chǎn)生的臨時(shí)對(duì)象纤子,還有就是內(nèi)斂嵌套內(nèi)斂這種復(fù)雜的情況搬瑰。所以內(nèi)斂函數(shù)有其優(yōu)點(diǎn)但是要小心使用。

構(gòu)造控硼、析構(gòu)泽论、拷貝語意學(xué)

未完待續(xù)。卡乾。翼悴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹦赎,更是在濱河造成了極大的恐慌谍椅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件古话,死亡現(xiàn)場離奇詭異雏吭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陪踩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門杖们,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肩狂,你說我怎么就攤上這事摘完。” “怎么了傻谁?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵孝治,是天一觀的道長。 經(jīng)常有香客問我审磁,道長谈飒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任态蒂,我火速辦了婚禮步绸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吃媒。我一直安慰自己,他們只是感情好吕喘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布赘那。 她就那樣靜靜地躺著,像睡著了一般氯质。 火紅的嫁衣襯著肌膚如雪募舟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天闻察,我揣著相機(jī)與錄音拱礁,去河邊找鬼。 笑死辕漂,一個(gè)胖子當(dāng)著我的面吹牛呢灶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钉嘹,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼鸯乃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了跋涣?” 一聲冷哼從身側(cè)響起缨睡,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鸟悴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后奖年,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體细诸,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年陋守,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了震贵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗅义,死狀恐怖屏歹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情之碗,我是刑警寧澤蝙眶,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站褪那,受9級(jí)特大地震影響幽纷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜博敬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一友浸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偏窝,春花似錦收恢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汽煮。三九已至锭环,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間四苇,已是汗流浹背已骇。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工离钝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褪储。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓卵渴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲤竹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奖恰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一個(gè)博客,這個(gè)博客記錄了他讀這本書的筆記,總結(jié)得不錯(cuò)瑟啃÷鄯海《深度探索C++對(duì)象模型》筆記匯總 1. C++對(duì)象模型與內(nèi)...
    Mr希靈閱讀 5,590評(píng)論 0 13
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,519評(píng)論 1 51
  • 1. 結(jié)構(gòu)體和共同體的區(qū)別。 定義: 結(jié)構(gòu)體struct:把不同類型的數(shù)據(jù)組合成一個(gè)整體蛹屿,自定義類型屁奏。共同體uni...
    breakfy閱讀 2,127評(píng)論 0 22
  • 妮寶,六月你值日月错负,看到同學(xué)都放學(xué)了坟瓢,媽媽雖然著急,但也只能耐心等候犹撒。因?yàn)閶寢屩滥阕鍪乱幌蚍浅UJ(rèn)真折联。今天你考了語...
    恩企媽媽閱讀 103評(píng)論 0 0
  • 端坐在女兒課桌前 爬山虎的藤莖在外墻上 畫出歲月痕跡 松柏刺穿冬日的寒冷 心里的枯草開始斷裂倒伏 新芽在腐朽里茂密...
    巖馬閱讀 162評(píng)論 1 4