2015-05-05

C/C++编程的现代习惯

Views: 19846 | 8 Comments

相对于汇编语言是一门操作 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. C++ const& 的坑
  2. 小心 int 乘法溢出!
  3. 使用 jemalloc 编译过程出错的问题
  4. 编写JSP/PHP+MySQL留言本
  5. SSDB 使用 jemalloc
Posted by ideawu at 2015-05-05 14:39:32

8 Responses to "C/C++编程的现代习惯"

  • c++11之后string不能再以COW实现了 Reply
    @neo: 你好, 能给一个 reference 吗? Reply
    @ideawu:
    下文摘自c++14标准(相关内容是C++11引入的)
    21.4.1 basic_string general requirements
    5 References, pointers, and iterators referring to the elements of a basic_string sequence may be invalidated
    by the following uses of that basic_string object:
    (5.1) — as an argument to any standard library function taking a reference to non-const basic_string as an argument.234
    (5.2) — Calling non-const member functions, except operator[], at, front, back, begin, rbegin, end, and rend.
    []操作符不允许造成引用失效
    string test("test");
    char &a = test[0];
    string test2 = test;
    char &b = test[1];
    使用cow实现的话,会导致引用a生效 Reply
  • 感谢~想问下主流编译器从哪个版本开始可称之为”现代“,从而可以使用这些原则? Reply
  • Copy On Write 的 string有线程安全的问题,不能简单的当作简单类型来处理的。 Reply
  • 问个问题 如何利用string减少内存的分配? 多谢 Reply
  • 如果是dll间string传递,写时拷贝特性还是有风险的吧,存在内存释放的问题 Reply

Leave a Comment