目录
前言
如果说并行计算是常数级的效率优化,并不能改变所运行算法的时间复杂度,那么C++语言的相对效率就是在程序的众多细小的地方进行改善。可能每个微小的改变之会让程序快几个时钟周期。但是,如果这个操作的运行要以兆计次呢。
如果时光倒流三十年,这些操作大概是程序员的必修吧。
不同范围类型的变量,应在哪里存储
栈存储(Storage on the stack)
- 在函数中声明的局部变量和对象都使用栈存储。
- 栈是内存的一部分,对于函数返回地址、函数参数、局部变量,每次调用函数都会在内存中分配栈空间,当函数返回时释放该空间。
- 因为重复使用相同范围的地址,栈是用来存储数据效率最高的空间(如果没有很大的数组,这部分数据将在一级缓存中)。
- 所有变量和对象最好在使用它们的函数中声明。
全局或静态存储(Global or static storage)
- 任何函数之外声明的变量称为全局变量。
- 全局变量的优点是可以在程序启动之前将其初始化为所需的值。
- 全局变量的内存空间在整个程序执行过程中都被占用。
- 如果非必需,就不要声明全局变量(不同线程之间的通信需要全局变量是唯一无法避免的情况)。
寄存器存储(Register storage)
- 寄存器存储,存储的是在函数中声明的局部变量和对象(原因在第二条)。
- 所有优化编译器都会自动选择一个函数中最常用的变量存储在寄存器中。
- 同一个寄存器可以用于多个变量,只要他们的使用周期不重叠。。
- 寄存器的数量非常有限,64位系统,约有14个整数寄存器,16个浮点寄存器。
易变变量(volatile)
- volatile关键字可将一个变量声明为可被其它线程改变(我还没用过)。
- volatile关键字不具有原子性,即其可以被两个或两个以上变量同时改变。
线程本地存储(Thread-local storage)
- 大多数编译器可以使用关键字__thread或__declspec(thread)来实现静态变量和全局变量的线程本地存储。
- 即每一个线程,都具有变量的一个副本。
- 由于线程本地存储是通过在线程环境块中的指针进行访问,因此是低效的。
- 应尽量避免线程本地存储。
Far
- 在具有分段内存的系统中,可以通过Far关键字将变量存储在其它数据段中(开始自由起来…)。
- far关键字同样也是低效的。
动态内存分配
- 内存中可以通过堆(一种数据结构)来存储动态分配的变量。
- 动态内存分配由new和delete运算符或malloc和free函数完成,这些运算符和函数会消耗大量时间。
- 动态内存分配是低效的,且会使代码更复杂且容易出错。
- 动态内存分配在后面会继续详细讨论。
类中声明的变量
- 类中声明的变量安装他们在类声明中的顺序存储。
- 存储类型(堆、栈还是内存静态空间)由对象在哪里定义来决定。
- 将变量存储在类或结构中是一种很好的方法,可以确保在程序中的相同部分中使用的变量也存储在彼此附近。