馬上要找工作了,發現自己很多看過的書都忘記了,於是開始寫部落格記錄一下,也想以後自己能回憶回憶這段經曆吧。後台開發這本書比較適合找C++後台開發的人讀,裡面的知識點比較關鍵,面試基本都會用到。
第一章 C++常用編程技術
1 strlen()與sizeof()的區別:
strlen()計算字串的長度,遇到字串末尾的’\0’結束。
sizeof()為宏定義的運算子,在編譯之前就已經算好。
2 字串、字串指標以及字元數組的區別
string str1 = "Hello world !"; //字串,string類char str2[] = "I am a programmer." ;//字元數組char * str3 = "abc";//字串指標
字串str1是string類的一個執行個體,存放在以首地址為首的連續記憶體塊中,並以Null 字元結束,與str2比較類似。str2為字元數組,由若干個數組元素組成,每個元素存放字串的一個字元,也是以Null 字元結尾。str3字串指標變數本身是一個變數,用於存放字串的首地址。可以改變str1使它指向不同的字串,但不能改變str1所指的字串常量。因為定義指標時,編譯器並不為指標所指向的對象分配空間,它只是分配指標本身的空間,所以adc會被當成常量,放到程式的常量區,無法被修改。
3 結構體struct與共同體union在記憶體單元中的計算
一般64位機器各種內建類型所佔儲存空間如下:
sizeof(char) = 1; sizeof(short) = 2; sizeof(int) = 4; sizeof(long) = 4; sizeof(float) = 4; sizeof(double) = 8; sizeof(long long) = 8;
很多人都知道電腦資料結構要遵守記憶體對齊的規則,但至於為什麼說得比較模糊。在一般程式員心中,記憶體是一個位元組一個位元組組成的,但是在CPU的眼裡,記憶體是由一個塊一個塊組成的,現代CPU為64位,最多可同時讀8個位元組塊。假設現在CPU要讀取4個位元組的資料(假設記憶體讀取粒度為4):1.資料從第0個位元組開始: 直接讀取0-3個位元組就結束了。2.資料從第1個位元組開始: 需要讀取0-3個位元組以及4-7個位元組,才能讀到1-4位元組。這也就是為什麼要進行記憶體對齊的原因。某些平台如果記憶體不對齊還會拋出硬體異常而導致程式崩塌。
簡單的結構體對齊如下:
#include <iostream>using namespace std;struct A{ char a; int b; short c;};struct B{ short c; char a; int b;};int main(){ cout<<"sizeof(A) = "<<sizeof(A)<<endl;//4+4+4=12 cout<<"sizeof(B) = "<<sizeof(B)<<endl;//2+1+4=7}
帶數組情況的結構對齊:
情況看似特殊,實則與普通的比較相似。
#include <iostream>using namespace std;struct A{ int a; int b; char ch[10];};struct B{ char a; char b; int ch[10];};int main(){ cout<<sizeof(A)<<endl; //20 cout<<sizeof(B)<<endl; //44 return 0;}
結構體中帶結構體的記憶體對齊:
這種情況有點小複雜,內部結構體與外部變數之間的記憶體地區是分開的。讓我們來看下面一段代碼:
#include <iostream>using namespace std;struct A{ int a; double b; char ch[10];};struct B{ char a; char b; int ch[10]; struct A as;};int main(){ cout<<sizeof(A)<<endl; //32 cout<<sizeof(B)<<endl; //80 return 0;}
4 預先處理
帶參數的宏定義:
#define func1(x) x*x //會引起誤會,例如下面句子func1(3+2);//顯然結果不盡人意#define func2(x) ((x)*(x))//正確寫法,每一個括弧都很有必要
do… while的妙用:
當遇到宏定義為複合陳述式時會用到
#define Foo(x) do{\statement one;\statement two;\}while(0) // 這裡沒有分號
例如:
if(conditon)Foo(x);else