gpt4 book ai didi

c++ - 如何减小可执行文件的大小?

转载 作者:行者123 更新时间:2023-12-05 00:43:28 30 4
gpt4 key购买 nike

当我使用 {fmt} 库编译此代码时,可执行文件大小变为 255 KiB,而仅使用 iostream header 则变为 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 倍。

最佳答案

与任何其他图书馆一样,有固定费用和每次调用费用。 {fmt} 库的固定成本确实是 around 100-150k没有调试信息(它取决于编译器标志)。在您的示例中,您正在比较与库链接的固定成本,以及 iostreams 看起来更小的原因是因为它包含在标准库本身中,它是动态链接的,不计入可执行文件的二进制大小。

请注意,这个大小的很大一部分来自浮点格式化功能,它甚至不存在于 iostreams(最短的往返表示)中。

如果您想比较对实际代码更重要的每次调用二进制大小与大量格式化函数调用,您可以查看目标文件或生成的程序集。例如:

#include <fmt/core.h>

int main() {
fmt::print("Oh hi!");
}

生成(https://godbolt.org/z/qWTKEMqoG)

.LC0:
.string "Oh hi!"
main:
sub rsp, 24
pxor xmm0, xmm0
xor edx, edx
mov edi, OFFSET FLAT:.LC0
mov rcx, rsp
mov esi, 6
movaps XMMWORD PTR [rsp], xmm0
call fmt::v8::vprint(fmt::v8::basic_string_view<char>, fmt::v8::basic_format_args<fmt::v8::basic_format_context<fmt::v8::appender, char> >)
xor eax, eax
add rsp, 24
ret

同时

#include <iostream>

int main() {
std::cout << "Oh hi!";
}

生成(https://godbolt.org/z/frarWvzhP)

.LC0:
.string "Oh hi!"
main:
sub rsp, 8
mov edx, 6
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
xor eax, eax
add rsp, 8
ret
_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

除了 cout 的静态初始化之外,没有太大区别,因为这里几乎没有格式化,所以在这两种情况下它只是一个函数调用。添加格式后,您将很快看到 {fmt} 的好处,例如http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html#BinaryCode .

关于c++ - 如何减小可执行文件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70270325/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com