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
}