C++ 为什么在汇编输出中有这么多iostream的样板文件?

C++ 为什么在汇编输出中有这么多iostream的样板文件?,c++,gcc,assembly,C++,Gcc,Assembly,对于以下代码: int main() { } 对于g++-pedantic-Wall-O3-S-o test.asm test.cpp和&cat test.asm,程序集输出是干净的。如果我做了gcc-xc。。。测试c(顶部为#include),除标签名称外,输出相同。实际上,它是在C++还是C模式下并不重要。其他标题如,,,等给出相同的结果 .file "test.cpp" .section .text.unlikely,"ax",@progbits .LCOLDB

对于以下代码:

int main()
{
}
对于
g++-pedantic-Wall-O3-S-o test.asm test.cpp和&cat test.asm
,程序集输出是干净的。如果我做了
gcc-xc。。。测试c
(顶部为
#include
),除标签名称外,输出相同。实际上,它是在
C++
还是
C
模式下并不重要。其他标题如
等给出相同的结果

    .file   "test.cpp"
    .section    .text.unlikely,"ax",@progbits
.LCOLDB0:
    .section    .text.startup,"ax",@progbits
.LHOTB0:
    .p2align 4,,15
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    xorl    %eax, %eax
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .section    .text.unlikely
.LCOLDE0:
    .section    .text.startup
.LHOTE0:
    .ident  "GCC: (GNU) 4.9.0 20131223 (experimental)"
    .section    .note.GNU-stack,"",@progbits
但一旦添加
#include
,它就会爆炸(相同的部分省略):

什么使
特别

一个可能相关的引用是:

就静态初始化顺序而言,cout保证为 正确构造和初始化,不迟于 构造ios_base::Init类型的对象,并包含 至少作为此类对象的一次初始化计数 具有静态持续时间

这提供了一个代码段:

#include <ostream>
#include <istream>

namespace std
{
    extern istream cin;
    extern ostream cout;
    ....

    // this is explained below
    static ios_base::Init __foo;    // not its real name
} 
#包括
#包括
名称空间标准
{
外间流cin;
外部环境;
....
//下文对此进行解释
静态ios_base::Init _foo;//不是它的真名
} 
相关报价:

现在,前面提到的运行时惩罚:全局对象必须 在您自己的任何代码使用它们之前进行初始化;这是 由标准保证。与任何其他全局对象一样,它们必须是 初始化一次且仅初始化一次。这通常是通过一个 与上面的构造类似,嵌套类ios_base::Init是 正是出于这个原因在标准中规定的

根据§27.3/2:“对象[std::cin、std::cout等]为: 构建,并在之前的某个时间建立关联 第一次调用ios_base::Init类的对象时 在任何情况下,在主体开始之前建造 执行。”


罪魁祸首确实是
ios_base::Init
行,正如的评论所示。因此,如果msdn链接是正确的,那么这意味着
就是出于这个原因。

我想知道,如果你真的实例化并使用了一个流,你是否会得到与
相同的结果。你的引用没有回答你的问题吗?@JonathonReinhart是的,我想是的,但直到我用谷歌搜索它时才意识到原因。
#include <ostream>
#include <istream>

namespace std
{
    extern istream cin;
    extern ostream cout;
    ....

    // this is explained below
    static ios_base::Init __foo;    // not its real name
}