
























29 secondwtq 2023 年 3 月 26 日这是个有趣的问题。实际上如果只是想把一个东西做得体积很大很简单,一个真实的故事: 类似地,如果工程中涉及到根据外部数据文件生成可执行代码,如 RPC 协议通信等,随着数据越来越多,附加的代码也会越来越多。 另外,编译器优化也可能导致代码体积的指数增长,常见地例如: 我这有个对比的例子是 GTK3 。目前我这的 GTK3 包一共 49MB ,不过里面有一堆 GTK 元数据和 locale 之类的东西。只看最关键的 libgtk-3.so ,这玩意一共 7.8 MB ,其中 .text 大概有 3.7MB ,由 500 多个 .o 链接而成,这些 .o 的 .text 大小相加和 libgtk-3.so 的 .text 差不多。.text 最大的前 10% 的 .o ,.text 大小加起来大概 1.6MB 。这些 .o 对应的源码大小加起来大概 7.6MB 。总的源码大小是 17MB (只算 .c ,不算 header )。把 .o 的 .text 大小,和对应 .c 文件的大小画个图,可以很清楚地发现 .c 文件的大小大概是 .text 大小的 4-6 倍,平均值是 5 倍左右。 ffmpeg 包一共 37MB ,其中最大的是 libavcodec.so ,15MB 。.text 有 10MB 。大概有 1100 个 .o (我去除了一部分直接汇编出的 .o ,这些 .o 的 .text 加起来大概 1MB )。.text 最大的前 10% 的 .o ,.text 大小加起来大概 5.3MB 。这些 .o 对应的源码大小加起来大概 5.6MB ,总的源码大小是 19MB 。部分 .o 依然满足 4-6 倍的规律,但是整体的分布分散了许多。很多头部的 .o ,其 .c 文件大小是 .text 文件大小的两倍,一倍,甚至零点几倍。总的来说相比 GTK3 ,ffmpeg 编译生成的 .text 要更大。 #14 的链接中指出使用 --enable-small 选项(即指示编译器优先优化代码体积)可以数倍降低 libavcodec.so 的大小。暗示编译器优化是巨大体积的重要因素。不过我实测的效果并没有那么吼,.text 大概降低了 40% 左右。相对地,libgtk-3.so 降低了不到 20%。不过确实可以看到很多的 .o 文件 .text 大小成倍地缩小。GTK3 则鲜有缩小超过 30% 的 .o 。 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。