4

ファイルを反転する非常に小さな C プログラムがあります。Windows でコンパイルするとexe、サイズが 28,672 バイトのファイルになります。

  • ファイルサイズを縮小するための最良の方法は何ですか?
  • 最も多くのスペースを占めるものを教えてくれるツールはありますか? (含まれるライブラリ)
  • このような単純なプログラムでは、このサイズは正常ですか?
  • ファイルサイズを縮小するには、どのコンパイラフラグを使用する必要が/O1ありますか (/Os効果がないようです)?

ところで-でコンパイルするgccと約50Kbのファイルが得られ、でコンパイルするとcl28Kbになります。

編集:ここにコードがあります

#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 のファイルが生成されます。
  • (Tiny C Compiler)でコンパイルするとtcc、2Kb のファイルが生成されました。
  • コンパイルするとgcc -s -O2、8Kb ファイルが生成されます。
4

4 に答える 4

6

tcc: http://bellard.org/tcc/を使用してコンパイルしてみてください。

于 2012-11-20T15:19:46.843 に答える
3
#include <stdio.h>

stdio 関数の独自のバージョンを実装した人に言わせてください: それらは非常に大きく、相互に依存しています。それらの 1 つをリンクすると、他のいくつかのリンクが自動的にリンクされます。

これは 1 回限りのコストであり、大規模なアプリケーションの範囲では問題にならないため、ほとんどのライブラリはこれを最適化することをあまり気にしません。

そうは言っても、静的なものではなく、動的にリンクする実行可能ファイルにコンパイルするのが通常の方法です。静的にリンクされた実行可能ファイルが必要な場合は、組み込み環境用に最適化されたライブラリの 1 つを検討することをお勧めします。これらのライブラリは、このような小さなサイズの最適化に重点を置いているためです

于 2012-11-20T15:24:04.990 に答える
1

-sgcc フラグを確認します。

-s すべてのシンボル テーブルと再配置情報を実行可能ファイルから削除します。

私が開発している小さな C プログラムでのテスト:

なし-s: 120,2 Kib

-sあり: 58,3 Kib

実行可能ファイルからデッド コードを削除すると、次のようになります。

コンパイラを使用-fdata-sections -ffunction-sectionsすると、未使用の関数が分離されたセクションに配置され、使用-Wl,--gc-sectionsすると `link によって削除されます。

現在のファイル サイズ: 50,2 Kib

-O2

多くの最適化を行いますが、通常とは異なり、ファイル サイズを増やすことはありません。

現在のファイル サイズ: 42,1 KiB

-O*ファイルサイズを優先して最適化するにはgccが多すぎます。

于 2012-11-20T15:38:12.600 に答える
1

どのライブラリを使用していますか? 標準ライブラリを除いて、C でファイルを反転するためのライブラリは必要ありません。次に、実行可能ファイルは 2kb を超えてはなりません。

ただし、コンパイルすると:

int main()
{
    return 0;
}

MinGW では、実行可能ファイルのサイズは 48kb です。しかし、最適化フラグは使用していません。

編集: -s フラグを使用すると、7,5 kb に縮小されます。

于 2012-11-20T15:22:55.837 に答える