为什么在组装输出中有那么多iostream样板?

用户名

对于以下代码:

int main()
{
}

对于g++ -pedantic -Wall -O3 -S -o test.asm test.cpp && cat test.asm,装配输出毫无疑问是干净的。如果我gcc -x c ... test c#include <stdio.h>在顶部,输出是相同的,除了标签名称。实际上,无论是处于C++还是C模式,都没有关系其他头喜欢<string><vector><algorithm><ostream>等给予了相同的结果。

    .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 <iostream>,它就会炸毁(省略了相同的部分):

    .section    .text.unlikely
.LCOLDE0:
    .section    .text.startup
.LHOTE0:
    .section    .text.unlikely
.LCOLDB1:
    .section    .text.startup
.LHOTB1:
    .p2align 4,,15
    .type   _GLOBAL__sub_I_main, @function
_GLOBAL__sub_I_main:
.LFB1027:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    movl    $_ZStL8__ioinit, %edi
    call    _ZNSt8ios_base4InitC1Ev
    movl    $__dso_handle, %edx
    movl    $_ZStL8__ioinit, %esi
    movl    $_ZNSt8ios_base4InitD1Ev, %edi
    addq    $8, %rsp
    .cfi_def_cfa_offset 8
    jmp __cxa_atexit
    .cfi_endproc
.LFE1027:
    .size   _GLOBAL__sub_I_main, .-_GLOBAL__sub_I_main
    .section    .text.unlikely
.LCOLDE1:
    .section    .text.startup
.LHOTE1:
    .section    .init_array,"aw"
    .align 8
    .quad   _GLOBAL__sub_I_main
    .local  _ZStL8__ioinit
    .comm   _ZStL8__ioinit,1,1
    .hidden __dso_handle
    .ident  "GCC: (GNU) 4.9.0 20131223 (experimental)"
    .section    .note.GNU-stack,"",@progbits

有什么<iostream>特别之处?

可能相关的一句话是:

根据静态初始化顺序,可以确保在不首次构造ios_base :: Init类型的对象的情况下正确构造和初始化cout,并包括将此类对象至少具有静态持续时间的初始化算作一次初始化。

用户名

这个MSDN论坛链接提供了一个代码片段:

#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
} 

相关报价:

现在,前面提到的运行时代价是:必须在您自己的任何代码使用全局对象之前初始化全局对象;这是标准所保证的。像任何其他全局对象一样,必须将它们初始化一次,并且只能初始化一次。通常,这是通过上述结构完成的,正是出于这个原因,在标准中指定了嵌套类ios_base :: Init。

标准报价

根据§27.3/ 2:“构造了[std :: cin,std :: cout等]对象,并在ios_base :: Init类的对象首次出现之前或期间的某个时间建立了关联。构造,并且无论如何在主体开始执行之前。”

ios_base::Init正如乔浩的评论所暗示的那样罪魁祸首确实是排队因此,如果MSDN链接是正确的,那么这意味着<iostream>特别为这个原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在组装输出中有那么多iostream样板?

来自分类Dev

为什么HashMap中有那么多的null映射?

来自分类Dev

为什么有那么多canOpenURL?

来自分类Dev

为什么有那么多canOpenURL?

来自分类Dev

为什么/ usr / share / app-install / desktop中有那么多文件?

来自分类Dev

为什么在Ubuntu中有那么多默认字体?

来自分类Dev

Swift变量-为什么那么多?

来自分类Dev

为什么这个简单的MongoDB查询有那么多nYields?

来自分类Dev

为什么会有那么多虚拟控制台?

来自分类Dev

为什么会有那么多虚拟控制台?

来自分类Dev

删除一个空文件,为什么会有那么多sys调用?

来自分类Dev

SSD和HDD的健康状况如何(为什么有那么多读取错误?)

来自分类Dev

为什么我看到的页面错误没有我预期的那么多?

来自分类Dev

为什么malloc消耗那么多内存?

来自分类Dev

为什么作曲家需要那么多内存?

来自分类Dev

为什么我的程序使用那么多的内存运行?

来自分类Dev

为什么作曲家需要那么多内存?

来自分类Dev

为什么dwm.exe使用那么多的内存?

来自分类Dev

熊猫的加入方法。为什么那么多?

来自分类Dev

为什么这段代码会占用那么多内存?

来自分类Dev

为什么我的机器上有那么多的“ linux-”内核软件包,它们都做什么?

来自分类Dev

为什么Windows 8.1使用那么多磁盘空间?(如何防止它耗尽所有磁盘空间?)

来自分类Dev

什么是“系统和压缩内存”,为什么使用那么多内存?

来自分类Dev

Kworker,这是什么,为什么它占用那么多的CPU?

来自分类Dev

我发现了四种不同的方式来更改Xcode中的iOS状态栏。为什么有那么多?有什么区别?

来自分类Dev

为什么序列化Integer需要那么多(81)字节?

来自分类Dev

为什么我会收到那么多的.pdb文件?

来自分类Dev

为什么詹金斯会使用那么多内存?

来自分类Dev

为什么序列化Integer需要那么多(81)字节?

Related 相关文章

  1. 1

    为什么在组装输出中有那么多iostream样板?

  2. 2

    为什么HashMap中有那么多的null映射?

  3. 3

    为什么有那么多canOpenURL?

  4. 4

    为什么有那么多canOpenURL?

  5. 5

    为什么/ usr / share / app-install / desktop中有那么多文件?

  6. 6

    为什么在Ubuntu中有那么多默认字体?

  7. 7

    Swift变量-为什么那么多?

  8. 8

    为什么这个简单的MongoDB查询有那么多nYields?

  9. 9

    为什么会有那么多虚拟控制台?

  10. 10

    为什么会有那么多虚拟控制台?

  11. 11

    删除一个空文件,为什么会有那么多sys调用?

  12. 12

    SSD和HDD的健康状况如何(为什么有那么多读取错误?)

  13. 13

    为什么我看到的页面错误没有我预期的那么多?

  14. 14

    为什么malloc消耗那么多内存?

  15. 15

    为什么作曲家需要那么多内存?

  16. 16

    为什么我的程序使用那么多的内存运行?

  17. 17

    为什么作曲家需要那么多内存?

  18. 18

    为什么dwm.exe使用那么多的内存?

  19. 19

    熊猫的加入方法。为什么那么多?

  20. 20

    为什么这段代码会占用那么多内存?

  21. 21

    为什么我的机器上有那么多的“ linux-”内核软件包,它们都做什么?

  22. 22

    为什么Windows 8.1使用那么多磁盘空间?(如何防止它耗尽所有磁盘空间?)

  23. 23

    什么是“系统和压缩内存”,为什么使用那么多内存?

  24. 24

    Kworker,这是什么,为什么它占用那么多的CPU?

  25. 25

    我发现了四种不同的方式来更改Xcode中的iOS状态栏。为什么有那么多?有什么区别?

  26. 26

    为什么序列化Integer需要那么多(81)字节?

  27. 27

    为什么我会收到那么多的.pdb文件?

  28. 28

    为什么詹金斯会使用那么多内存?

  29. 29

    为什么序列化Integer需要那么多(81)字节?

热门标签

归档