最近我正在潜心优化我的 C++ 代码,因此开始使用编译器资源管理器。由于我主要使用 Visual Studio 在 Windows 上进行开发,因此我使用了 msvc 编译器。
在某些时候,msvc 失控了。经过一番摆弄后,我可以将其缩小到 iostream 标头,这应该是 I/O 的首选(SL.io.3)。
#include <iostream>
int main() {
std::cout << "Hello World!\n";
return 0;
}
虽然 gcc 或 clang 的总输出(main + 一个调用一些ios_base
init 函数的静态初始化程序)总共大约 20 行汇编(在 Godbolt 编译器资源管理器过滤掉指令和注释之后)。
MSVC 将其分解为 4000 行。这些行中的大多数是单独的函数;MSVC 对main
自身的定义是 7 条指令,而 gcc/clang 则为 8 条。(使用 GNU/Linux 的 gcc/clanglibstdc++
将额外长度的 arg 传递给 cout 运算符重载函数,而不仅仅是 MSVC 在使用其自己的 C++ 库时所做的 2 个指针。)
如果我改用类似的东西puts
,MSVC 的总输出相当紧凑,与 gcc/clang 相当,就像这里一样。
有人可以向我解释这里发生了什么,我做错了什么或指出我正确的方向吗?
为什么使用 C++ 库的简单函数的 MSVC asm 列表如此臃肿?