热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

包含iostream导致不同的二进制

如何解决《包含iostream导致不同的二进制》经验,为你挑选了2个好方法。

编译以下代码

int main() {
    return 0;
}

给大会

main:
        xorl    %eax, %eax
        ret

https://gcc.godbolt.org/z/oQvRDd

如果现在iostream包括在内

#include    
int main() {
    return 0;
}

这个程序集已创建.

main:
        xorl    %eax, %eax
        ret
_GLOBAL__sub_I_main:
        subq    $8, %rsp
        movl    $_ZStL8__ioinit, %edi
        call    std::ios_base::Init::Init() [complete object constructor]
        movl    $__dso_handle, %edx
        movl    $_ZStL8__ioinit, %esi
        movl    $_ZNSt8ios_base4InitD1Ev, %edi
        addq    $8, %rsp
        jmp     __cxa_atexit

打开完全优化(-O3). https://gcc.godbolt.org/z/EtrEX8

有人可以解释一下,为什么包含一个未使用的头更改二进制 什么是_GLOBAL__sub_I_main:



1> Maxim Egorus..:

每个包含的翻译单元都包含一个ios_base::Init对象的副本:

static ios_base::Init __ioinit;

此对象用于初始化标准流(std::cout及其朋友).此方法称为Schwarz Counter,它确保标准流在首次使用之前始终初始化(iostream包括提供的标头).

该函数_GLOBAL__sub_I_main是编译器为每个转换单元生成的代码,该转换单元调用该转换单元中的全局对象的构造函数,并且还安排在退出时调用相应的析构函数调用.调用此代码之前,C++标准库启动代码将调用此代码main.


这就是为什么你应该在不需要引用cin,cout,cerr,wcin,wcout和wcerr的翻译单元中包含``和/或``而不是``.
初始化,并且(可能更重要的是)在正常终止之前刷新它们.

2> StoryTeller ..:

包括iostream头部具有添加静态std::ios_base::Init对象的定义的效果.此静态对象的构造函数初始化标准流对象std::cout,std::cerr依此类推.

它完成的原因是避免静态初始化命令惨败.它确保流对象在翻译单元之间正确初始化.


即使使用链接时优化,我也不认为编译器有足够的信息来理解`__ioinit`在不引用任何标准流的转换单元中是多余的.
推荐阅读
  • 字符串的题目用库函数往往能大大简化代码量介绍几个常用的C的字符串处理库函数strtok()原型char*strtok(chars[],constchar*delim); ... [详细]
  • C++语言学习(六)——二阶构造模式
    C++语言学习(六)——二阶构造模式一、构造函数的问题构造函数存在的问题:A、构造函数只提供自动初始化成员变量的机会B、不能保证初始化逻辑 ... [详细]
  • ProblemA.MonsterPathCodejamonisamobilegameinwhichmonstertrainer ... [详细]
  • 初步认识虚函数(一)
    首先,虚函数是这么定义的,简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象 ... [详细]
  • 【声明:版权所有,转载请标明出处,请勿用于商业用途。联系信箱:libin493073668@sina.com】2.1基本内置类型1.算术类型分为两类:整型(integraltype,包括字符 ... [详细]
  • http:blog.csdn.nethardVBarchive200710101818756.aspx请从opencv_share@163.com密码:download ... [详细]
  • IwasstudyingfasterIOmethodsforprogrammingproblems,Ifoundoutthismethodofusinggetchar ... [详细]
  • 第五周项目一——体验常成员函数(1)
    设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等。在设计中,由于求距离、求对称点等操作对原对象不能造成任何改变,所以,将这些函数设计为常成员函数是合适的,能够避免数据成 ... [详细]
  • ProblemDescriptionAninchwormisatthebottomofawellninchesdeep.Ithasenoughene ... [详细]
  • 题目:poj2342Anniversaryparty题意:话说一个公司的一些然要去参加一个party,每个人有一个愉悦值,而如果某个人的直接上司在场的话会非常扫兴,所以避免这样 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来 ... [详细]
  • 对象内存地址
    主  题 ... [详细]
author-avatar
阿依古丽丹_736
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有