使C程序更小

时间:2012-11-20 15:16:13

标签: c

我有一个非常小的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的文件。

4 个答案:

答案 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*来优化文件大小。