世面上将c++性能优化的书其实不少了,但是很多都停留在架构、算法、数据结构层面,大都是些老生常谈了。而从语言本身、操作系统、硬件层面系统阐述性能优化的技术书则少了很多。而《optimizing software in c++》正是这样的一本书,作者Agner Fog的职业也挺有意思,除了是计算机科学家,还是进化人类学家,而且后者看起来还是主业…
这周末花了一天时间阅读了这本书中感兴趣的几个章节。笔者将会连载几篇读书笔记总结主要知识点。
-
7 The efficiency of different C++ constructs
-
8 Optimizations in the compiler
-
9 Optimizing memory access
-
11 Out of order execution
-
12 Using vector operations
The efficiency of different C++ constructs
这章主要介绍c++语言中各种特性对性能的影响。
不同的变量存储位置
stack
众所周知,函数中的临时变量或对象一般存储在内存空间中的stack区。每当调用函数时,参数和临时变量进栈,当函数返回时,参数和临时变量出。s由于stack可被不断重复使用,栈是内存空间中最高效的存储方式。当临时变量中没有大对象时,访问栈上的临时变量也基本能用上L1 data cache.
global or static
在函数体之外声明的变量称之为global变量,可被任何函数访问。被static修饰的变量称为static变量。
global和static变量在程序运行期间会被放置于内存空间中的静态数据区。静态数据区域分为三个部分:一部分存储const类型的global/static变量,一部分存储已被初始化的global/static变量,最后一部分存储未被初始化的global/static变量
使用静态数据区的好处是,global/static变量在程序启动前就有专门的存储位置,坏处是在程序的生命周期内,这些存储位置将被一直占据,可能会降低data cache的效率。
所以建议尽量不要使用global变量
register
register变量存储在cpu寄存器中,函数中的临时变量特别适合放到register中。优点很明显,访问register变量比访问RAM快得多,但是cpu寄存器大小是非常有限的,在64位x86架构中,有:
-
14个整数寄存器
-
16个浮