为什么不能在编译器中自动包含<iostream>?

时间:2019-07-29 16:59:11

标签: c++ iostream

因此,我注意到我所做的大多数代码都具有i#include <iostream>。这让我感到奇怪。为什么C ++无法自动包含iostream?是的,我知道您无需使用iostream即可进行编码,但是在基本编码应用程序方面,我将节省大量时间。

但是,是的,它将占用内存存储空间,但是我的问题是……...头?每个单独的存储器都至关重要吗?它有多重要?

2 个答案:

答案 0 :(得分:6)

  

所以我注意到我们用C ++编写的所有代码有一个共同点,即头文件iostream

那是不正确的。

我的大多数文件都不包含<iostream>。如果大多数人都这样做,则可能是您的程序没有特别好的架构来分离问题。我的大部分程序将执行计算,移动数据,管理某些GUI,与数据库对话或连接到网络。这些都不涉及IOStreams库。

如果您只是在文件全部的顶部编写#include <iostream>,则无论文件是否需要IOStreams功能,您都应该停止这样做。

  

我只是想知道,为什么那里的编译器不能只将iostream包含在系统中?

他们可以。他们不想。

  

这样做将使我们不必每次都键入#include <iostream>

您必须明确要求一些东西是。如果我不使用IOStreams库,我不希望编译器浪费时间,包括构建和交付IOStreams库的部分。

  

如果我错了,实际上有一种不用头文件进行编码的方法(但我认为没有)

如果要在某个翻译单元中使用IOStream,则需要#include <iostream>(或该库中的其他一些相关头文件)。

如果您不想在某个翻译单元中使用IOStream,请不要#include <iostream>。就这么简单。

答案 1 :(得分:3)

因为许多程序不需要它。

看看仅包含iostream(启用了优化功能)的overhead并询问是否不需要它:

_GLOBAL__sub_I_main:
        sub     rsp, 8
        mov     edi, OFFSET FLAT:_ZStL8__ioinit
        call    std::ios_base::Init::Init() [complete object constructor]
        mov     edx, OFFSET FLAT:__dso_handle
        mov     esi, OFFSET FLAT:_ZStL8__ioinit
        mov     edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
        add     rsp, 8
        jmp     __cxa_atexit

正如@Frank和@Justin指出的那样,原始开销为std::ios_base::Init::Init()