Time of Update: 2018-12-05
在前面的文章裡聊完了進程終止對C++對象析構的影響。今天咱們來說一下線程對於C++對象析構的影響。 由於C++ 03標準沒有包含線程的概念,而C++0x尚未正式發布。所以對線程的討論只好根據特定的作業系統平台來談。對於作業系統內建的線程API,目前比較流行的款式是Windows平台提供的線程API和POSIX平台上的pthread
Time of Update: 2018-12-05
上一個文章聊完了Win32環境下和線程有關的C++對象死亡問題,今天得說一說POSIX的線程庫pthread了。如果你對pthread不太瞭解,可以先看看維基百科的介紹。 ★三種死法 廢話少說,照例先介紹三種死法。 1、自然死亡 上一個文章已經介紹了Win32線程的自然死亡,pthread的自然死亡和它差不多,也是線程對應的線程函數通過return返回。 2、自殺 對於“自殺”,POSIX使用pthread_exit函數來實現。就一種方式,相比Win32的自殺簡單多了,此處省去不
Time of Update: 2018-12-05
在跨平台的開發過程中,很多問題都和編譯器有關。因此我們先來聊聊編譯器相關的問題。 ★編譯器的選擇 首先,GCC是優先要考慮支援的,因為幾乎所有作業系統平台都有GCC可用。它基本上成了一個通用的編譯器了。如果你的代碼在A平台的GCC能夠編譯通過,之後拿到B平台用類似版本的GCC編譯,一般也不會有太大問題。因此GCC是肯定要考慮支援的。 其次,要考慮是否支援本地編譯器。所謂本地編譯器就是作業系統廠商自產的編譯器。例如相對於Windows的本地編譯器就是VisualC++。相對於Solari
Time of Update: 2018-12-05
上一個文章提到了“硬體體系”相關的話題,今天來說說和作業系統相關的話題。C++跨平台開發中和OS相關的瑣事挺多,所以今天會囉嗦比較長的篇幅,請列位看官見諒
Time of Update: 2018-12-05
我承認這個文章的名稱有標題黨的嫌疑,但是暫時想不出更好的名稱了,只好先這樣了
Time of Update: 2018-12-05
目前還有相當一部分開發人員在使用老式編譯器幹活,這些老式編譯器可能對C++98支援不夠。因此,當你的代碼移植到這些老式的編譯器上時,可能會碰到一些稀奇古怪的問題(包括編譯出錯和執行階段錯誤)。下面這些注意事項有助於你繞過這些問題。 強調一下,後面提到的好幾個條款都是通過迴避C++的新文法來保證移植性。如果你用的是新式編譯器,那麼你可以不理會這些條款。 ★小心for迴圈變數的範圍(不支援新標準) 在C++98標準中,for迴圈變數的範圍局限在迴圈體內。而某些老的編譯器(例如Visual
Time of Update: 2018-12-05
要說C++對象是怎麼死的,得先從C++的解構函式說起。這玩意兒是我本人很喜歡的一個語言特性(可惜有好幾個語言沒有類似的玩意兒,具體就不點名了,免得引發口水戰)。我們可以利用C++的構造和解構函式,來實現Guard模式,寫出比較清晰、簡練和異常安全的代碼。由於Guard模式在C++程式中運用挺多,所以保證所有對象被析構就是一個很重要很嚴肅的問題。 另外,我發現很多C++程式員只關心記憶體泄露問題,不關心(或不清楚)資源流失問題(很類似於我在“Java新手通病[3]”提到的現象)。比如昨天的“
Time of Update: 2018-12-05
為參加一次機試,我不得不重拾自從大學畢業後就再沒用過的C。還好是機試,我可以自己選一本書研讀,不用忍受小強的嘮裡嘮叨。說到選書,不禁又想起了大學時代K小強書的情景。小強的書講的是真細,一不小心就掉入細節的汪洋大海中,爬都爬不出來。小強秉承了中國老師的一貫作風,對學生真是心貼心、手把手,硬是把一門程式設計語言嚼成一口一口的知識點,生怕學生們犯錯。而且這種書巨好出題考你,甭管你程式寫得怎麼樣,把小強的知識點背熟包你高分。學C語言用TCPL,沒有什麼好說的。有意思的是我手邊還有一本中文版的,我給女朋友
Time of Update: 2018-12-05
上一個文章“文法”由於篇幅有限,沒來得及聊異常,現在把和異常相關的部分單獨拿出來說一下。 ★小心new分配記憶體失敗 早期的老式編譯器產生的程式碼,如果new失敗會返回null 指標。我當年用的Borland C++3.1似乎就是這樣的,現在這種編譯器應該不多見了。如果你目前用的編譯器還有這種行為,那你就慘了。你可以考慮重載new操作符來拋出bad_alloc異常,便於進行異常處理。 稍微新式一點的編譯器,就不是僅僅返回null
Time of Update: 2018-12-05
讀完了第一章。這章主要是從整體上介紹了C語言,並不牽扯太多細節,試圖給讀者一個整體的印象,並能讓讀者馬上寫一些不複雜的C程式。這點很重要,作者一開篇就明確指出,"The only way to learn a new programming language is by writing programs in it."
Time of Update: 2018-12-05
本節談一談演算法分析和大O估演算法(big-O notation)。演算法效率的度量一般採用事前分析估算的方法,通常的做法是,“從演算法中選取一種對於所研究的問題(或演算法類型)來說是基本操作的原操作,以該基本操作重複執行的次數作為演算法的時間量度”。談到這裡時,作者引出了大O估演算法。在本書中,作者對大O估演算法的介紹顯得有些草率。一開始就冒出一個式子T(n) =
Time of Update: 2018-12-05
今天寫程式的時候,又用到這個idiom了,於是順便貼出來。這個idiom蠻簡單的,估計很多人都用過。今天主要是貼出來給新手參考(老手們就甭費時看此帖了)。 為了說明這個手法具體該咋用,咱舉一個簡單的例子來說事兒。比方說要開發一個網路程式,其中需要統計各種網路通訊協定的資料包數量。 ★版本1 假設一開始只需要處理HTTP和FTP兩種協議。有些同學不假思索,立即會聲明如下兩個整數用於統計:int nCntHttp = 0;int nCntFtp =
Time of Update: 2018-12-05
今天聊聊C++的可移植性問題。如果你平時使用C++進行開發,並且你對C++的可移植性問題不是非常清楚,那麼我建議你看看這個系列。即使你目前沒有跨平台開發的需要,瞭解可移植性方面的知識對你還是很有協助的。 C++的可移植性這個話題很大,包括了編譯器、作業系統、硬體體系等很多方面,每一個方面都有很多內容。鑒於本人能力、精力都有限,只能介紹每一個方面最容易碰到的問題,供大伙兒參考。 後面我會分別從編譯器、C++文法、作業系統、第三方庫、協助工具輔助、開發流程等方面進行介紹。 為了方便閱讀,把
Time of Update: 2018-12-05
本來上一節介紹鏈式表示時,還應提到迴圈鏈表和雙向鏈表,但我決定還是不提為好。如果將學習一門課程的方法比作遍曆演算法的話,我覺得廣度優先演算法要比深度優先演算法好。一門全新的課程,如果一開始就進入具體的細節的話,很容易有挫折感,進而喪失興趣。所以如果能對這門課程有一個大局觀,瞭解這門課程是講什麼的,涉及那些知識,學了有什麼用,然後再由淺入深、循序漸進的逐步深入應該效果更好。但是很可惜,學校授課時從來都是按照深度優先演算法,把一章的細節講得清清楚楚再進入下一章。結果常常是,上第一節課時還很有興趣的同
Time of Update: 2018-12-05
第三章講的是流程式控制制,對於經常使用類C語言的人來說,這章的內容應該是爛熟於胸。其中引起我注意的地方有下面幾點:給你一個字串,讓你寫一個小程式把它反轉,大概很多人在應聘時都遇到過類似的小問題。作者在這裡給出了他的實現,這段程式寫得乾淨漂亮,讓我忍不住把它貼在這裡:#include <string.h>/* reverse: reverse string s in place */void reverse(char s[]){ int c, i, j; for (i =
Time of Update: 2018-12-05
從本節開始討論線性表,這次先討論線性表的順序實現。一提到線性表,我們腦子很可能會出現數組、鏈表這樣的概念。沒錯,數組和鏈表都是線性表,但它們只是線性表的兩種實現,強調的是線性表的物理結構。我們研究一個資料結構時,一般先從它的邏輯結構入手,等研究清楚了邏輯結構再考慮具體的物理實現。在寫程式時,思路也是一樣的,先要分清哪些問題是邏輯的,哪些問題是物理的,先邏輯後物理是電腦解題的一般步驟。如果開始不想清楚邏輯,而一頭紮到物理細節中,就容易理不清思路或者作出有缺陷的設計。當然這不是絕對的,很多情況下物理
Time of Update: 2018-12-05
讀完了第二章:類型,運算子和運算式。下面列舉一些有啟發的點:關於類型(Type),作者用一句話很精闢地作了概括:"The type of an object determines the set of values it can have and what operations can be performed on it."一個對象的類型決定了它能夠取值的集合以及能對它進行的操作。 關於變數名,許多類C進階語言的編程規範都推薦類欄位的名字以底線"_"開始,但在C語言中,所有的變數名都不推薦用"
Time of Update: 2018-12-05
做了第一章的幾個練習題。Exercise 1-20. Write a program detab that replaces tabs in the input with the proper number of blanks to space to the next tab stop. Assume a fixed set of tab stops, say every n columns. Should n be a variable or a symbolic
Time of Update: 2018-12-05
第七章主要介紹了有關輸入輸出的庫函數。在提到庫函數時作者說到,"Programs that confine their system interactions to facilities provided by the standard library can be moved from one system to another without change." 由此可見,程式中和作業系統打交道的地方應該儘可能地使用標準庫函數,這樣可以增加可移植性。第一節
Time of Update: 2018-12-05
不覺文章已寫到了第十回,書也快看完了,就剩了最後一章。這第八章講的是UNIX的系統介面,並沒有新的語言特性要介紹。這次學習的目的主要是語言,UNIX系統的知識雖然很有興趣,但不是當務之急,也沒有實際需要,所以這章權且放棄。這樣一來,本文就成了一篇小結,我隨便說幾句看完這本書後的感受。這本書很薄,不算後面的附錄才167頁。作者在序言裡說到,C不是一門很複雜的語言,不需要一本很厚的書來介紹。就是在這短短的167頁,作者還作了精心的安排,第一章裡作者介紹了C語言的最基本特性,先引導讀者寫一些簡單的程式