C 細節筆記

2021-06-25 21:59:11 字數 1269 閱讀 8087

放在草稿箱裡都快遺忘了。。。還是發出來吧,僅作備忘

類與物件在記憶體中的情況小結

1.在c++中,物件即變數,「一塊記憶體」「唯一標識」。猜想:類與函式一樣,被編譯器放在**段(疑問:編譯器編輯時需要將其識別符號和入口位址一一對應,是放在符號表裡索引實現的嗎?應該是,編譯器用識別符號找到入口位址,然後通過該位址到**段訪問函式或類的**段)。例項時,編譯器找到類的位址,為物件分配記憶體空間(只分配棧上的,包括非靜態成員變數和虛擬表指標(如果類本身有定義虛函式的話))。

2.分配時,編譯器可能會對它進行位元組對齊。對齊簡單分析見:

3.只有虛函式是由具體物件的記憶體決定的(需要通過物件記憶體中的vftb來找到函式入口),其他直接通過類名加函式名即可直接找到。這同時也解釋了,如果沒有定義虛函式,則將基類指標指向子類物件時,只能訪問基類指標的相應函式(因為沒有vftb直接通過基類類名+函式名找到函式入口)

4.sizeof(classname)取得即為物件所佔記憶體的大小,即非靜態成員變數的大小與vftb的大小之和。不過要注意位元組對齊~~

宣告與定義小結

thinking in c++原文:c++中對變數宣告的解釋向來很模糊且自相矛盾。

因為 int x;這個申明中編譯器已經有足夠的資訊可以為變數開闢記憶體了(事實上,如果後面沒有複製,編譯器自動為該變數賦0)。所以如果需要真正的申明(即告訴編譯器該變數在此處只是宣告,由其他檔案或者在該宣告語句之後),故開闢記憶體,即相當於定義。

union可以像class,struct一樣定義函式,只不過其成員變數記憶體共享。但是union不能再繼承時作為基類使用。

const 返回值,在返回自定義型別時有意義,即表示返回值不能再被改變(如做左值,或者呼叫返回類物件的其他函式改變其值)。

volatile即表示編譯器不要對該值進行優化,用到它的時候一定要重新讀入暫存器!不能偷懶~~在多執行緒程式設計中一定要注意!

c/c++ 函式是從右向左進棧的,然後呼叫函式。

建構函式和析構函式可以直接引用類的靜態變數

引用和拷貝建構函式

1. void increment(int*& i) //指向指標的引用

2.編譯器會自動生成建構函式、析構函式、拷貝建構函式、=(賦值運算)。

3.深拷貝和淺拷貝。(淺拷貝會在資源釋放後再被訪問時變成野指標)

關於成員函式花括號前的const:是用來修飾this指標的,即 t const *(或const t*)

非靜態成員函式都有隱含的this,通過它來訪問成員。

const例項只能呼叫const型別的函式,即通過尋找this為const型別的函式。不能呼叫非const的成員函式

C語言細節筆記2

c語言常見問題筆記 1.指標的宣告 char p1,p2 p1 是乙個指向char型別的指標,而p2是乙個char型別變數 這是由於 並不是基本型別的一部分,而是包含被宣告識別符號的宣告符的一部分。2.儲存型別 同乙個靜態函式或靜態變數最好在所有的宣告和定義出都包含 static extern 作為...

c 學習筆記 細節關鍵點

本文記錄那些該知道卻不甚清楚的東西,基於書本和自己的理解。1.c 定義class,public內放的東西是給外人看的,class開放給外人的介面 private中放的成員是自己用的,外人不必知道,除了我的朋友 friend 2.member funtion必須在class主體內宣告,是否在主體內定義...

UDP細節筆記

資源列表 1.udp報文大小的影響因素udp包最大長度 65535 8 udp包頭 20 ip包頭 65507位元組 udp包理想長度 mtu 1500位元組,如果udp包大小超過mtu則會在ip層被分包。因此如果要避免分包,udp包最大為1500位元組,減去udp頭 8位元組 和ip頭 20位元組...