C/C++編程的現代習慣

ec3y 9年前發布 | 18K 次閱讀 C/C++開發 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:

  1. 小心 int 乘法溢出!
  2. 使用 jemalloc 編譯過程出錯的問題
  3. 編寫JSP/PHP+MySQL留言本
  4. SSDB 使用 jemalloc
  5. 百行代碼實現一個簡單的Zset(SortedSet)

原文鏈接: http://www.ideawu.net/blog/archives/878.html

 本文由用戶 ec3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!