【发布时间】:2018-12-06 10:43:26
【问题描述】:
我有一个文件,当它编译为目标文件时,其大小如下:
- 在 Windows 上,使用 MSVC,它是 8MB。
- 在 macOS 上,使用 clang,它是 8MB。
- 在 linux(Ubuntu 18.04 或 Gentoo)上,使用 gcc 或 clang,大小为 20MB。
该文件(详述如下)是 Unicode 表(的一部分)以及字符属性的表示。编码为utf8。
我突然想到问题可能是 libstdc++ 不能很好地处理文件,所以我在 Gentoo 上用 clang 尝试了 libc++,但它没有做任何事情(目标文件大小保持不变)。
然后我认为可能是一些优化做了一些奇怪的事情,但是当我从 -O3 转到 -O0 时,我再一次没有大小改进。
The file,line 50 包括 UnicodeTable.inc。 UnicodeTable.inc 包含 unicode 代码点的 std::array。
我尝试将 std::array 更改为 C 样式数组,但同样,目标文件大小没有改变。
我有CodePoint.cpp 的预处理版本,可以用$CC -xc++ CodePoint.i -c -o CodePoint.o 编译。 CodePoint.i 包含约 40k 行 STL 代码和约 130k 行 unicode 表。
我尝试将预处理后的 CodePoint.i 上传到 gists.github.com 和 paste.pound-python.org,但都拒绝了 17 万行长的文件。
在这一点上,我没有想法,非常感谢有关找出“臃肿”目标文件大小的来源的任何帮助。
【问题讨论】:
-
每个平台上的
sizeof (RawCodePoint)是什么? -
我假设您在某些时候将 .o 文件用作共享库或可执行文件的一部分——该可执行文件在 Linux 下是否也大 12MB?即使在可执行文件上运行
strip之后? -
可执行文件有多大?由于目标文件是临时的,大小重要吗?
-
您使用的完整编译器命令行是什么?
-
这个问题可能有助于进一步分析结果:stackoverflow.com/questions/11720340/…