代码改变世界

随笔分类 -  C plus plus

C++代码性能

2013-03-14 10:18 by Freeman in Qt, 380 阅读, 收藏,
摘要: 影响性能的操作:* I/O的开销* 函数调用的开销* 复制对象的开销* 对可能不必要的对象进行创建和销毁* 在频繁调用的函数中进行对象的跟踪(Trace),这种情况尽量使用内联,因为此时主要的开销来自函数的调用和返回* 沉余构造(构造函数中没有使用列表),如 C (const char *s) { name = s; } // 这种情况会首先调用name的默认构造函数,然后s会覆盖默认值。还有一种情况,假如name所属类没有char *的赋值操作符,会产生构造和销毁一个临时变量的指令。提倡:* 应编写短小的,频繁调用的内联函数* 函数参数按引用传递* 使用内联的构造和析构函数(当频繁构造对象时 阅读全文

为抽象基类定义虚析构函数

2012-10-22 10:15 by Freeman in Qt, 568 阅读, 收藏,
摘要: Class Base{ virtual ~Base() = 0 // 纯虚析构函数 { // 定义体 ; }};结论:1.Base没有其它成员函数可用的时候,通过定义纯虚析构函数来实现抽象类的定义。2.当定义了虚析构函数必须有定义体,因为虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。这就是说,即使是抽象类,编译器也要产生对~Base的调用,所以要保证为它提供函数体。如果不这么做,链接器就会检测出来,最后还是得回去把它添上 阅读全文

[转]在堆上分配内存

2012-07-17 17:33 by Freeman in Qt, 1016 阅读, 收藏,
摘要: 可能许多人对内存分配上的“栈 stack”和“堆 heap”还不是很明白。包括一些科班出身的人也不明白这两个概念。简单的来讲,stack上分配的内存系统自动释放, heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里。stack一般是静态分配内存,heap上一般是动态分配内存。由malloc系统函数分配的内存就是从堆上分配内存。从堆上分配的内存一定要自己释放。用free释放,不然就是术语——“内存泄露”(或是“内存漏洞”)—— Memory Leak。于是,系统的可分配内存会随malloc越来越少,直到系统崩溃。还是来看看“栈内存”和“堆内存”的差别吧。栈内存分配:(典型的函数 阅读全文

模版中 typename 与 class 区别

2012-07-13 14:05 by Freeman in Qt, 313 阅读, 收藏,
摘要: 按 C++ 标准来说,template<typename T> 用于基础数据类型,typename 指类型名,T 可以取 char int double 等。template<class T> 用于类,T 可以取任何类。但是这里有一个问题,结构体应该用 typename 还是 class? 结构体肯定不是基础数据类型,但也不是类。所以实际情况是,template<class T> 的 T 也可以取基础数据类型,tempate<typename T> 的 T 也可以取类。 但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerC 阅读全文