【发布时间】:2022-01-13 03:04:25
【问题描述】:
当我使用 {fmt} 库编译此代码时,可执行文件大小变为 255 KiB,而仅使用 iostream 标头则变为 65 KiB(使用 GCC v11.2)。
time_measure.cpp
#include <iostream>
#include "core.h"
#include <string_view>
int main( )
{
// std::cout << std::string_view( "Oh hi!" );
fmt::print( "{}", std::string_view( "Oh hi!" ) );
return 0;
}
这是我的构建命令:
g++ -std=c++20 -Wall -O3 -DNDEBUG time_measure.cpp -I include format.cc -o runtime_measure.exe
与iostream 相比,{fmt} 库不应该是轻量级的吗?还是我做错了什么?
编辑:通过将-s 添加到命令中以从可执行文件中删除所有符号表和重定位信息,它变为156 KiB。但仍然比 iostream 版本高出约 2.5 倍。
【问题讨论】:
-
我不认为它会做太多,但用
替换“core.h”,只包含你使用的内容。 -
@Pepijn Kramer 您的意思是在 C++20 中添加的标头?但我想用
fmt::print替换cout,这可能会执行得更快。 -
它是关于最小化您包含的代码“core.h”可能包含比您实际需要的更多的代码。通过包含
您只包含编译代码实际需要的头文件。在这种情况下,如果您只包含 (如果我是对的,它会为您包含 string_view ,因为它将它作为其 api 的一部分公开),您的代码应该编译 -
轻量级库并不一定意味着“更小的可执行文件大小”。它也可以指运行时内存使用量或 CPU 周期的减少(类似的可观察效果)——可能会实现但也会增加可执行文件大小的事情——或者是开发人员想到的任何其他事情。无论如何,一个或另一个库的细节会导致更大/更小的可执行文件取决于许多因素。
-
@Peter 如您所见,与 iostreams 相比,{fmt} 在生成的二进制代码大小方面的开销减少了 60%,并且非常接近 printf。在github.com/fmtlib/fmt/blob/master/README.rst
标签: c++ gcc executable fmt