關於C C 的一些小知識點總結(不定時更新)

2021-10-13 07:41:49 字數 1952 閱讀 2869

什麼是內聯函式?

使用inline修飾的函式叫做內斂函式,在編譯時c++編譯器會在呼叫內聯函式的位置展開,所以沒有函式壓棧的開銷,因此內斂函式提高了程式執行的效率

特性:

1.inline是一種以空間換時間的做法,省去呼叫函式開銷,所以**很長或者有迴圈/遞迴的函式不適合使用內聯函式

2.inline對於編譯器來說只是乙個建議,編譯器會自動優化。如果定義為inline的函式體內有迴圈/遞迴,編譯器優化時會忽略內聯函式

3.inline不建議將宣告和定義分離,分離會導致鏈結錯誤,因為inline展開的話,無法找到函式位址,鏈結也找不到

巨集的優缺點?

優點:

1.增強**的復用性。

2.提高效能。

缺點:

1.不方便除錯巨集。(因為預編譯階段進行了替換)

2.導致**可讀性差,可維護性差,容易誤用。

3.沒有型別安全的檢查 。

c++有哪些技術替代巨集?

1.常量定義 換用const

2.函式定義 換用內聯函式 inline

3.enum

結構體內存對齊規則

1.第乙個成員在結構體偏移量為0的位址處

2.其它成員變數要對齊到某個數字(對齊數)的整數倍的位址處

注意:對齊數=編譯器預設的乙個對齊數與該成員變數的較小值(vs中預設對齊數為8)

3.結構體總大小為:最大對齊數(所有變數型別最大者與預設對齊引數取最小)的整數倍

4.如果巢狀了結構體,巢狀的結構體對齊到自己的最大對齊數的整數倍數處,結構體的整數大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍

面試題:

1.為什麼進行記憶體對齊?

記憶體對齊大大提高了cpu的讀取速率。

1.並非所有硬體平台都可以訪問任何位址上的任何資料,有些硬體平台也只能訪問某些特定位址處某些特定型別的資料。

2.記憶體對齊的cpu只需要讀取一次,沒有記憶體對齊,cpu則需要讀取兩次。

2. 如何讓結構體按照指定的對齊引數進行對齊?

設定對齊引數可在結構體struct之前加上#pragma pack(對齊數),在struct之後加上#pragma pack;便可以設定對齊引數

3. 如何知道結構體中某個成員相對於結構體起始位置的偏移量?

可以使用這個#define offsetof(s,a) (size_t) (((s*)0)->a),這個用法就是我們告訴編譯器有乙個指標指向結構體s,而它的值是0,然後我們取結構體中的a,a的位址就是a的偏移量了

以乙個冒號開始,然後以乙個逗號分隔資料成員列表,每個成員變數後面跟著放初始值或表示式(建構函式體內的語句只能將其稱做賦初值,不能稱做初始化)

class

date

private

:int _year;

int _month;

int _day;

};

注意:

1.每個成員變數只能在初始化列表**現一次(即只能初始化一次)

2.當類中包含以下成員時,必須放在初始化列表位置進行初始化

引用成員變數,const成員變數,自定義型別成員變數(該類沒有預設建構函式)

3.盡量使用初始化列表初始化,對於自定義型別,會優先使用初始化列表初始化

4.成員變數在類中的宣告次序就是在初始化列表中的初始化順序與其在初始化列表中的先後次序無關

1.建構函式

三個因素:查詢速度,資料量,記憶體使用

總結一些小知識點

1.int8u,int16u 通常在arm中,表示8位無符號char型別與16位無符號char型別,通常,兩者的區別只是取值範圍的不同。2.浮點精度 fp16 fp16 fp16 3.在c 中,如果使用string型別的話,使用模式為 std string 4.在c 中,如果在string型別情況下...

關於VUE的一些小知識點

1.頁面載入時需要通過ajax去獲取下拉列表的select 資料時候,1 vue 的data裡面要定義資料 2 在方法裡面寫獲取select的方法 3 在js裡面寫 方法的呼叫 4 在頁面中展示 js varvm newvue methods vm.getoptions html divid aa ...

關於python的一些小知識點

1.python連線資料庫 python連線資料庫時,查詢語句的字段如果是字串,必須帶上雙引號 2.啟動虛擬環境 python m venv 資料夾名稱 建立虛擬環境 cd 檔名稱 scripts 切換到scripts下 activate 進入到虛擬環境 deactivate 退出虛擬環境 3.使用...