gcc 和 g++的區別
gcc與g++都是gnu(組織)的乙個編譯器。
gcc與g++都可以編譯c**與c++**。但是:字尾為.c的,gcc把它當做c程式,而g++當做是c++程式;字尾為.cpp的,兩者都會認為是c++程式。
編譯階段,g++會呼叫gcc,對於c++**,兩者是等價的,但是因為gcc命令不能自動和c++程式使用的庫聯接,所以通常用g++來完成鏈結。
編譯可以用gcc/g++,而鏈結可以用g++或者gcc -lstdc++。因為gcc命令不能自動和c++程式使用的庫聯接(當然可以選擇手動鏈結,使用命令如下),所以通常使用g++來完成聯接。但在編譯階段,g++會自動呼叫gcc,二者等價。
gcc編譯的四個步驟
棧溢位原因和解決方式
堆疊溢位的最常見原因是過度深度或無限遞迴,其中函式呼叫自身的次數太多,以至於儲存與每個呼叫關聯的變數和資訊所需的空間超出了堆疊的範圍。
infinite recursion -> 如果遞迴演算法可能遞迴未知次數或大量次數,則自己管理遞迴(通過維護自己動態分配的堆疊)或將遞迴演算法轉換為等效迭代演算法
very deep recursion -> 確保任何遞迴演算法在已知最大深度後終止
very large stack variables -> 不要在堆疊上分配大變數
c++記憶體洩漏的幾種情況
在類的建構函式和析構函式中沒有匹配的呼叫new和delete函式
沒有正確地清除巢狀的物件指標
在釋放物件陣列時在delete中沒有使用方括號
指向物件的指標陣列不等同於物件陣列
缺少拷貝建構函式
缺少過載賦值運算子
關於nonmodifying運算子過載的常見迷思
沒有將基類的析構函式定義為虛函式
出現野指標
c++位元組對齊
位元組對齊原因:
1)平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料,某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常
2)硬體原因:經過記憶體對齊之後,cpu的記憶體訪問速度大大提公升,幫助cpu定址。
對齊位數跟處理器位數和編譯器都有關改變預設的對界條件(指定對界):
使用偽指令#pragma pack (n),c編譯器將按照n個位元組對齊。
使用偽指令#pragma pack (),取消自定義位元組對齊方式。
#pragma pack (8)
struct mystruct
; int main()
輸出為24:
double是8位元組,現在偏移量是8
char是1位元組,偏移量8是1的整數倍滿足條件,現在偏移量為8+1=9
int是4位元組,偏移量9不是4的整數倍故先填充3個位元組才能滿足條件,現在偏移量為9+3+4=16
short是2位元組,偏移量16是2的整數倍滿足條件,後面沒了,故補齊至8,現在偏移量為16+8=24
#pragma pack (8)
是64位編譯器的預設對齊方式,如果改為#pragma pack (4)
則輸出為20。
[1]. stack overflow.
面試準備c (二)
stl容器和底部原理 二倍增長的動態陣列,線性連續空間,有容量限制。每次擴大到二倍時要重置所有迭代器,開銷很大 deque 雙端佇列 雙向開口的儲存空間分段連續的資料結構,每段資料空間內部是連續的,而每段資料空間之間則不一定連續 正因為段之間不連續,所以他整體也是不連續的,不用擔心容量問題 list...
2012面試準備 2012 10 26面試準備
c 1 什麼純虛函式?首先,二者申明不一樣。virtual void test void 虛函式 virtual void test void 0 純虛函式 其次,如果乙個類包含了乙個純虛函式 哪怕只有乙個是純虛函式 那麼它就是乙個抽象類 就是不能生成具體的物件!但如果類中只包含虛函式,那麼是可以定...
《面試準備》C 工廠模式
參考 簡單工廠模式 在工廠類做判斷,從而建立相應的產品,當增加產品時需要修改工廠類。簡單工廠模式 列舉 enum cartype 抽象類 多型 提高基類 class car 具體類 產品1 class bencicar public car 工廠方法模式抽象工廠類,只提供乙個介面,通過子類去擴充套件...