4 votes

Réduire la taille d'un programme C

J'ai un tout petit programme en C qui inverse un fichier. Il se compile sous Windows en un programme exe d'une taille de 28 672 octets.

  • Quelle est la meilleure approche pour réduire la taille du fichier ?
  • Existe-t-il des outils qui peuvent me dire ce qui prend le plus de place ? (y compris les bibliothèques)
  • Cette taille est-elle normale pour un programme aussi simple ?
  • Quels drapeaux de compilateur dois-je utiliser pour réduire la taille du fichier ( /O1 y /Os ne semble pas avoir d'effet) ?

BTW - quand il est compilé avec gcc J'obtiens un fichier d'environ 50Kb et quand il est compilé avec cl J'obtiens 28Kb.

EDIT : Voici le code

#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;
}

UPDATE :

  • Compilation avec /MD a produit un fichier de 16Kb.
  • Compilation avec tcc (Tiny C Compiler) a produit un fichier de 2Kb.
  • Compilation avec gcc -s -O2 a produit un fichier de 8Kb.

6voto

alinsoar Points 3583

Essayez de le compiler en utilisant tcc : http://bellard.org/tcc/ .

3voto

DevSolar Points 18897
#include <stdio.h>

Qu'il soit dit par quelqu'un qui a implémenté sa propre version des fonctions stdio : Elles sont assez grosses, et quelque peu interdépendantes. Lier l'une d'entre elles en lie plusieurs autres automatiquement.

Comme il s'agit d'un coût unique, et que cela n'a pas d'importance dans le cadre de grandes applications, la plupart des bibliothèques ne se soucient pas beaucoup de l'optimiser.

Ceci étant dit, la compilation dans un dynamiquement La solution consiste généralement à utiliser un exécutable de liaison plutôt qu'un exécutable statique. Si vous ont pour avoir un exécutable lié statiquement, vous pouvez vous tourner vers l'une des bibliothèques optimisées pour les environnements embarqués, car elles sont plus axées sur les optimisations de petite taille comme celle-ci.

1voto

Tim Points 773

Quelles sont les bibliothèques que vous utilisez ? Vous n'avez pas besoin de bibliothèques pour inverser un fichier en C, à l'exception de la lib standard. Ensuite, votre exécutable ne devrait pas dépasser 2kb.

Cependant, si je compile :

int main()
{
    return 0;
}

avec MinGW, la taille de l'exécutable est égale à 48kb. Mais je n'ai pas utilisé de drapeaux d'optimisation.

Edit : Avec le drapeau -s, il est réduit à 7,5 kb.

1voto

Jack Points 3695

Vérifiez -s drapeau gcc :

-s Supprime toutes les informations de table de symboles et de relocalisation de l'exécutable.

Un test avec un petit programme C que je suis en train de développer :

Sans -s : 120,2 Kib

Avec -s : 58,3 Kib

En supprimant le code mort de votre exécutable :

En utilisant -fdata-sections -ffunction-sections le compilateur placera la fonction inutilisée dans une section séparée qui, en utilisant la commande -Wl,--gc-sections sera supprimé par le `link.

La taille du fichier est maintenant de : 50,2 Kib

Par -O2

font beaucoup d'optimisations, mais sans augmenter la taille du fichier, généralement, contrairement à.

La taille du fichier est maintenant de : 42,1 KiB

gcc il y a trop de -O* à l'optimisation en faveur de la taille du fichier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X