C++: zero-cost static initialization
10 months ago
- #static-variables
- #C++
- #optimization
- 在C和C++中,静态变量可以在函数作用域内定义,具有静态存储期。
- 在C语言中,静态变量的初始化器必须是编译时常量,这些值会直接嵌入到二进制文件中。
- C++对静态变量有复杂的初始化规则,包括对块作用域变量进行动态初始化。
- C++中块作用域的静态变量在控制流首次经过其声明时初始化,并采用线程安全机制。
- 访问静态变量会因保护检查和同步机制而产生额外开销。
- 一种消除该开销的方法是利用链接器特性,在专用段中预初始化静态变量。
- 该解决方案使用`__attribute__((section))`和链接器符号`__start_SECNAME`与`__stop_SECNAME`实现高效初始化。
- 技术难点包括内联函数和模板成员中的段属性冲突,需要通过特殊方法解决。
- 最终方案采用嵌入式汇编指令和唯一符号命名来避免冲突。
- 该方法显著降低了访问开销,使块级静态变量效率与文件级变量相当。