Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 包括一个大标题以使用对象作为默认参数_C++_Include_Header Files_Iostream_Default Arguments - Fatal编程技术网

C++ 包括一个大标题以使用对象作为默认参数

C++ 包括一个大标题以使用对象作为默认参数,c++,include,header-files,iostream,default-arguments,C++,Include,Header Files,Iostream,Default Arguments,我正在开发一个用于命令行应用程序的小型库。该库的一个特性是它的主类可以在ostream中生成文本,如下所示: #include <iostream> class MyClass { std::string a; std::string b; void printToStream(std::ostream& stream = std::cout) { stream << "a: " << a &

我正在开发一个用于命令行应用程序的小型库。该库的一个特性是它的主类可以在ostream中生成文本,如下所示:

#include <iostream>    

class MyClass {
    std::string a;
    std::string b;

    void printToStream(std::ostream& stream = std::cout)
    {
        stream << "a: " << a << " | b: " << b << std::endl;
    }
}
#包括
类MyClass{
std::字符串a;
std::字符串b;
void printToStream(std::ostream&stream=std::cout)
{

stream非常简短的回答:当涉及到您的编程工作时,可能不是您最重要的决定

答案要长得多,它并没有告诉你们比上面更多的东西,但若你们有这种倾向,你们可能仍然会觉得有趣

这是一个高度依赖于您的环境敏感度的问题。如果您正在构建一个具有256KB RAM的系统,并且您必须将多个应用程序、操作系统和数据库引擎安装到所有这些中,显然,任何千字节的应用程序空间都是宝贵的。另一方面,在我的笔记本电脑或办公桌上顶级机器,一只手上的内存比手指上的内存多MB,可能根本不需要担心。在一个只有几兆RAM的中等规模系统中,降低代码大小并不是你的首要任务

我使用一个头文件快速编写了两个简单的应用程序:

myclass.h:

#include <iostream>    

class MyClass {
public:
    std::string a;
    std::string b;

    void printToStream(std::ostream& stream = std::cout)
    {
        stream << "a: " << a << " | b: " << b << std::endl;
    }
};
#include "myclass.h"

int main()
{
    MyClass m;
    m.a = "Hello";
    m.b = "World";
    m.printToStream();
}
#include "myclass.h"

int main()
{
    MyClass m;
    m.a = "Hello";
    m.b = "World";
}
大小以g++-O1:3502字节为单位,clang++-O1:4409

还有一个不使用printToStream的:

nouse.cpp:

#include <iostream>    

class MyClass {
public:
    std::string a;
    std::string b;

    void printToStream(std::ostream& stream = std::cout)
    {
        stream << "a: " << a << " | b: " << b << std::endl;
    }
};
#include "myclass.h"

int main()
{
    MyClass m;
    m.a = "Hello";
    m.b = "World";
    m.printToStream();
}
#include "myclass.h"

int main()
{
    MyClass m;
    m.a = "Hello";
    m.b = "World";
}
大小单位为g++-O1:2349字节,clang++-O1:2923

clang++-O1的大小差异约为1500字节,g++-O1的大小差异约为1200字节。总体代码大小约为2.5-4KB,因此在这个小示例中,它约为总体大小的30%。显然,这远远不是线性的-一旦使用
std::cout
,所有使用它的人都可以进行初始化

如果我将
myclass.h
文件修改为
#include
,并删除对流的引用,它会进一步从
nouse.cpp
生成的二进制文件中删除大约300字节的代码。这表明只需包含
将向二进制文件添加一些代码。但是,使用
而不是
对生成的二进制文件没有影响

我还尝试删除了
std::cout
默认参数。这没有任何区别(除了在
uses.cpp
中更改代码以增加参数),因此大小是相同的。它对
nouse.cpp
也没有影响-额外的代码仍然存在,用于初始化
cout

同样,在主文件中包含
,然后再包含
,对
uses.cpp的大小没有影响(不使用默认参数)

我也尝试了-O2,它使代码的大小发生了变化(在g++中变大,在clang++中变小),但相对差异不是很大

显然,这是两个最流行的开源C++编译器的两个实例。其他编译器可能会给出稍微不同的结果。如果非常重要,请使用编译器进行测试。


g++:7.2.0版本,随Ubunt一起提供,clang++:7.0.0(从git版本clang 16003bcdb4287aab3b87300d9e95f9b49ce52c1c、llvm 45ebd75cc103838da0b3938ac5d044ec8a7ff17b的源代码中构建)

可以使用重载,而不是使用默认参数?使用
无效printToStream(std::ostream&stream)
函数和一个
void printToStream()
函数。但是你仍然需要包含iostream来获得ostream的定义。我想如果我能摆脱对
iostream
的需求,我可以只包含
ostream
,它要小得多(并且还有
endl
的声明)。