C++後台開發核心技術實踐學習日誌2017/5/11__C++

來源:互聯網
上載者:User
馬上要找工作了,發現自己很多看過的書都忘記了,於是開始寫部落格記錄一下,也想以後自己能回憶回憶這段經曆吧。後台開發這本書比較適合找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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.