Linux興趣小組暑假留校第二次講座總結

暑假留校第二次講座,講了很多東西,聽的時候零零散散記下一些關鍵詞,現在把這些整理以下,以免以後忘記

編碼規範

作爲一個程序員,必不可少的事兒就是寫代碼,每個人寫代碼的風格和形式可能有所不同,我覺得這和一開始接觸代碼,寫代碼的時候慢慢形成的習慣,在我看來,寫代碼就像寫字一樣,還是要有一定的規範標準,按着這個規範來,寫出的代碼看起來會好看一些,舒服一些

1.代碼縮進

代碼縮進的時候可以手動打出4個空格,或者按Tab鍵自動向後空出4個空格,學長的建議是手動打出4個空格,因爲有的配置可能Tab縮進的是4個空格,有的可能是8個空格,這些可以設置,但如果用Tab 的話有的源碼分析工具可能分析不出來,出錯,因此還是手動打出4個空格較好

2.switch和case

在沒聽講座之前,我習慣於把case縮進到switch之後,感覺那樣會好看些,學長建議是把switch和case對齊,因爲case後面的代碼少了還沒問題,如果case後面代碼很多,這樣就不容易看出來case屬於那個switch,也有可能把case忽略掉,如果對齊的話就會好一點,想想也是,如果縮進很多的話,的確不容易看出case和switch的所屬關係

例子

/*對齊*/                                  /*縮進*/
switch(x){//                             switch(x){
case 1:                                     case 1:  
case 2:                                     case 2:
case 3:                                     case 3:
default:                                    default:
}                                           }

3.一行只寫一條語句
if while等後面要加上{}即使{}內只有一條語句
fd = open();等號兩邊要加兩個空格空出一點距離

在剛開始學習寫代碼的時候老師也強調過一行寫一條語句,C語言自由度很高,一行寫幾條語句也沒問題,但寫出的程序不僅要完成一些功能,解決一些問題,還要讓別人能閱讀,閱讀起來更舒服,一般我閱讀的時候會一行一行看,這行是什麼 ,然後跳掉下一行,這也許是一種思維習慣,如果一行中寫了幾條語句可能會一次要理解好幾條語句,所以在感覺上有些不舒服,還有一點就是一行寫幾條語句可能會顯得代碼太緊密,不便閱讀,if while 等後面加{}一方面是爲了使代碼更清晰明瞭,可以一眼看出哪個語句屬於哪個if 或者while等等,另一方面也是讓代碼更美觀,閱讀起來更方便,等號兩邊加空格也是同樣的作用,連在一起顯得太過緊密,加一些空格會看的很清晰

函數命名法

一、匈牙利命名法【Hungarian】: 廣泛應用於象 Microsoft Windows 這樣的環境中。 Windows 編程中用到的變量(還包括宏)的命名規則匈牙利命名法, 匈牙利命名法通過在變量名前面加上相應的小寫字母的符號標識作爲前綴, 標識出變量的作用域, 類型等。這些符號可以多個同時使用,順序是先 m_(成員變量),再指針,再簡單數據類型, 再其他。例如:m_lpszStr, 表示指向一個以 0 字符結尾的字符串的長指針成員變量。

二、駱駝命名法【camelCase】:
駱駝式命令法,正如它的名稱所表示的那樣,是指混合使用大小寫字母來構成變量和函數 的名字。例如,下面是分別用駱駝式命名法和下劃線法命名的同一個函數: printEmployeePaychecks(); print_employee_paychecks(); 第一個函數名使用了駱駝式命名法——函數名中的每一個邏輯斷點都有一個大寫字母來標記; 第二個函數名使用了下劃線法—-函數名中的每一個邏輯斷點都有一個下劃線來標記。

三、帕斯卡命名法【PascalCase】: 與駱駝命名法類似。只不過駱駝命名法是首字母小寫,而帕斯卡命名法是首字母大寫 如:public void DisplayInfo(); string UserName;

一個函數最好不要寫的太長,可以將代碼分成幾個塊,函數也能分成塊,用函數的嵌套可以讓程序看起來更有層次感,邏輯更加清晰

寫一個程序的時候,重要的不是寫代碼,更多的是設計程序的思路和想法,只有把思路和邏輯想清楚以後,在用代碼顯示出來,寫代碼的時候也就更快,出錯也就會更少,在調試程序的時候也會更容易找到錯誤

如果要寫很長的代碼時候,最好不要一次性寫完,然後在調試,代碼分成塊,寫完一塊就進行測試調試,調試好以後在寫下一個分塊,這樣最後找錯誤的時候就會容易的多

源碼分析工具和調試器

學長介紹了幾個源碼分析工具和調試器

源碼調試工具:
1.Ctags
2.Gtags
3.find
4.grep

調試器:
1.gdb
2.cgdb
3.DDD

優化代碼

1.數據上優化
2.數據結構優化
3.算法優化

SMP與多核

SMP:

SMP的全稱是”對稱多處理”(Symmetrical Multi-Processing)技術,是指在一個計算機上彙集了一組處理器(多CPU),各CPU之間共享內存子系統以及總線結構。

它是相對非對稱多處理技術而言的、應用十分廣泛的並行技術。在這種架構中,一臺電腦不再由單個CPU組成,而同時由多個處理器運行操作系統的單一複本,並共享內存和一臺計算機的其他資源。雖然同時使用多個CPU,但是從管理的角度來看,它們的表現就像一臺單機一樣。系統將任務隊列對稱地分佈於多個CPU之上,從而極大地提高了整個系統的數據處理能力。所有的處理器都可以平等地訪問內存、I/O和外部中斷。在對稱多處理系統中,系統資源被系統中所有CPU共享,工作負載能夠均勻地分配到所有可用處理器之上。

多核

多內核(multicore chips)是指在一枚處理器(chip)中集成兩個或多個完整的計算引擎(內核)。
我們說多核機器,是指一塊CPU芯片裏面有多個核心,核心與核心之間的通信是由
CPU芯片內部的總線完成的;

靜態鏈接

GCC編譯程序過程

1.預編譯
預編譯又稱爲預處理,是做些代碼文本的替換工作。是整個編譯過程的最先做的工作。

預編譯又稱爲預處理,是做些代碼文本的替換工作。
處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,條件編譯等
就是爲編譯做的預備工作的階段
主要處理#開始的預編譯指令

2.編譯
(1)利用編譯程序從源語言編寫的源程序產生目標程序的過程。
(2)用編譯程序產生目標程序的動作。 編譯就是把高級語言變成計算機可以識別的2進制語言,計算機只認識1和0,編譯程序把人們熟悉的語言換成2進制的。
(3)編譯程序把一個源程序翻譯成目標程序的工作過程分爲五個階段:
①詞法分析
②語法分析
③語義檢查和中間代碼生成
④代碼優化
⑤目標代碼生成。
主要是進行詞法分析和語法分析,又稱爲源程序分析,分析過程中發現有語法錯誤,給出提示信息。
3.彙編

彙編過程實際上指把彙編語言代碼翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。

4.鏈接

鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成爲一個能夠被操作系統裝入執行的統一整體。

GCC的編譯鏈接過程包括:
1. C預處理器(cpp),處理所有的宏定義,生成文本文件.i
2. C編譯器(cc1),生成彙編語言文件.s
3. 彙編器(as)生成可重定位的目標文件.o
4. 鏈接器(ld)把所有的.o和庫組合成一個可執行的目標文件
a) 符號解析:將每個符號的引用和一個符號定義聯繫起來
b) 重定位:編譯(cc1和as)生成的代碼(.text)和數據(.data)節的起始地址是0,需要把每個符號的定義和一個存儲器位置聯繫起來,然後修改所有對這些符號的引用。

GCC編譯程序流程圖

常用文件後綴名
這裏寫圖片描述

靜態鏈接

靜態鏈接是由鏈接器在鏈接時將庫的內容加入到可執行程序中的做法。鏈接器是一個獨立程序,將一個或多個庫或目標文件(先前由編譯器或彙編器生成)鏈接到一塊生成可執行程序。
靜態鏈接的最大缺點是生成的可執行文件太大,需要更多的系統資源,在裝入內存時也會消耗更多的時間。

靜態鏈接庫

靜態鏈接庫就是你使用的.lib文件,庫中的代碼最後需要連接到你的可執行文件中去,所以靜態連接的可執行文件一般比較大一些。格式如:#pragma comment(lib,”XXX.lib”)

linux下的靜態鏈接庫是*.a文件,與動態鏈接庫.so對應。
linux下.a文件,如果編寫了入口函數,也可以直接執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章