我有一个非常小的C程序可以反转文件。它在窗口上编译为大小为28,672字节的exe
文件。
/O1
和/Os
似乎没有任何效果?)顺便说一句 - 当用gcc
编译时,我得到大约50Kb文件,当用cl
编译时,我得到28Kb。
编辑:这是代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE *fi, *fo;
char *file1, file2[1024];
long i, length;
int ch;
file1 = argv[1];
file2[0] = 0;
strcat(file2, file1);
strcat(file2, ".out");
fo = fopen(file2,"wb");
if( fo == NULL )
{
perror(file2);
exit(EXIT_FAILURE);
}
fi = fopen(file1,"rb");
if( fi == NULL )
{
fclose(fo);
return 0;
}
fseek(fi, 0L, SEEK_END);
length = ftell(fi);
fseek(fi, 0L, SEEK_SET);
i = 0;
while( ( ch = fgetc(fi) ) != EOF ) {
fseek(fo, length - (++i), SEEK_SET);
fputc(ch,fo);
}
fclose(fi);
fclose(fo);
return 0;
}
更新
/MD
进行编译产生了一个16Kb的文件。tcc
(Tiny C编译器)编译生成了一个2Kb文件。gcc -s -O2
进行编译产生了一个8Kb的文件。答案 0 :(得分:4)
尝试使用tcc编译它:http://bellard.org/tcc/。
答案 1 :(得分:3)
#include <stdio.h>
让某人实施他自己版本的stdio功能可以说:它们相当大,而且有些相互依赖。将其中一个链接自动链接到其他几个链接。
由于这是一次性成本,并且在大型应用程序的范围内无关紧要,因此大多数图书馆都不会因为优化它而烦恼。
话虽这么说,编译成动态链接可执行文件而不是静态文件通常是要走的路。如果 拥有静态链接的可执行文件,您可能需要查看针对嵌入式环境优化的库之一,因为它们更关注于像这样的小型优化。
答案 2 :(得分:1)
您使用哪些库? 除标准库外,您不需要任何用于在C中反转文件的库。那么你的可执行文件不应该大于2kb。
但是如果我编译:
int main()
{
return 0;
}
使用MinGW,可执行文件的大小等于48kb。但我没有使用任何优化标志。
编辑:使用-s标志,它减少到7,5 kb。
答案 3 :(得分:1)
查看-s
gcc标志:
-s 从可执行文件中删除所有符号表和重定位信息。
我正在开发的小型C程序测试:
没有-s
: 120,2 Kib
使用-s
: 58,3 Kib
删除可执行文件中的死代码:
通过使用-fdata-sections -ffunction-sections
,编译器会将未使用的函数放入separed部分,使用-Wl,--gc-sections
将被`链接删除。
现在文件大小为: 50,2 Kib
按-O2
做了很多优化,但通常不会增加文件大小。
现在文件大小为: 42,1 KiB
gcc还有一些-O*
来优化文件大小。