C/C++編程的現代習慣
相對于匯編語言是一門操作 CPU 寄存器的語言, C/C++ 是一門操作內存的語言, 這是傳統的觀點. 但現代的程序應用開發, 大多是把 C/C++ 當作一門應用層語言, 所以必須適當地減少對內存的關注. 這也是本文所要講的 - C/C++ 編程的現代習慣.
1. 不要害怕返回結構體和類的實例
在一些古董級的編程書里, 你絕對看不到返回結構體或者類的實例, 它們告訴你"不能返回局部變量的內存". 事實上, 返回結構體(類)的實例, 并不是把局部變量的內存(指針)返回給調用者使用, 而把局部變量復制到調用者棧上的內存. 而且, 很多情況下編譯器會優化, 根本就不會發生內存拷貝.
返回結構體(類)的實例, 比返回 malloc() 分配的內存的指針在實踐上具有更多的優勢, 既能使代碼更清晰, 也可以完全避免內存泄漏.
2. 不要害怕傳遞 STL 的 string
無論你把 STL 的 string 作為函數返回值還是參數, 都永遠不要擔心內存拷貝的問題, 永遠不要! string 經過了良好的優化, 并且具有寫時拷貝特性, 你將 string 傳來傳去, 就跟整數賦值的成本差不多. 相信我, 你可以這樣認為.
3. 利用 string 來減少顯式的內存分配和釋放
STL 的 string 幾乎可以完全替代 malloc/free 內存操作. 它有寫時拷貝的特性, 它有自動擴大的特性, 你完全可以在許多場景用它來替代顯式的內存分配, 而且利用它在退出作用域時自動釋放內存的語言特性(和某些自動鎖類似), 避免了內存泄露的可能性.
4. 記住, STL 的 string 不是字符串!
記住, string 不是字符串, 它是一段內存, 內存中的每一個字節可以是任意值, 多個 '\0' 字符也可以出現在 string 中. 只有當你調用了它的 c_str() 方法, 它才和 C 語言的字符串有聯系, 在你調用 c_str() 之前, 記住, string 不是字符串!
5. 你要理解代碼導致內存的變化, 但不要被內存限制
C/C++ 語言是一門操作內存的語言, 這是永遠的基礎. 你必須理解你的每一行代碼導致的內存的變化, 這樣你才能正確地進行 C/C++ 編程. 但是, 理解你的業務, 快速地封裝出內存相關的核心代碼, 然后把內存忘記.
Related posts:
原文鏈接: http://www.ideawu.net/blog/archives/878.html