为何GCC 13.1包含<iostream>时不生成额外代码?
GCC 13.1 包含不再生成静态初始化代码的原因
问题描述
假设有如下简单程序:
#include <iostream> int main() { return 12; }
在GCC 4.x至12.x版本编译时,会生成包含__static_initialization_and_destruction_0等与std::ios_base::Init相关的静态初始化代码。但从GCC 13.1开始,包含<iostream>头文件不再生成这些额外代码,请问这是由于<iostream>头文件改动还是GCC 13.1的优化特性导致?
回答
这是GCC 13.1引入的优化特性导致的,而非<iostream>头文件的改动。
在GCC 13之前,只要包含<iostream>头文件,编译器就会为全局的std::ios_base::Init对象生成静态初始化代码——这个对象的作用是初始化标准IO流的状态(比如设置cout的格式、关联流缓冲区等),即使程序里根本没有使用任何标准IO操作(比如cout、cerr)。
GCC 13开始实现了**std::ios_base::Init的延迟初始化优化**:将这个对象的初始化时机推迟到程序第一次调用标准IO操作的时候。如果你的程序像示例中那样,只是包含<iostream>但完全没用到标准IO,编译器就不会生成那些相关的静态初始化代码,从而减少了程序启动时的开销。
内容的提问来源于stack exchange,提问作者TonySalimi
相关产品推荐
相关产品推荐

