Pergunta

Eu estou trabalhando em um programa C ++ eo código objeto compilado a partir de um único arquivo 1200-line (que inicializa uma máquina de estado bastante complexo) sai a quase um megabyte. O que poderia estar fazendo o arquivo tão grande? Existe uma maneira que eu possa encontrar o que leva o espaço dentro do arquivo objeto?

Foi útil?

Solução

Pode haver várias razões quando arquivos objeto são maiores do que eles têm que ser no mínimo:

  • estaticamente incluindo bibliotecas dependentes
  • construir com informações de depuração
  • construir com informações de perfil
  • criação (extremamente) estruturas de dados complexos usando templates (talvez recursiva boost-estruturas)
  • não ligar otimizar bandeiras durante a compilação (poupa nem tanto e pode causar dificuldades se usado também extremamente)

No começo eu sugiro para verificar se você está construindo com informações de depuração, isso faz com que o mais inchaço na minha experiência.

Outras dicas

(estou assumindo otimizações que você tem e código morto decapagem ligado).

Ligar opção "gerar arquivo de mapa" do seu ligador e examinar a saída.

culpados comuns são macros / modelos que produzem grandes quantidades de código, e grandes objetos globais.

Possivelmente alguns instantiations modelo (especialmente os std::iostreams), e extensa inlining (classes ou seja, que são totalmente definidos em um cabeçalho) talvez. No entanto, qual é o problema com um arquivo de objeto de 1 megabyte, em primeiro lugar? Durante a ligação, ele pode muito bem resultar em um pequeno binário. Eu tenho um projeto aqui com 20 MB de arquivos objeto que fica ligado em um KiB binária 700, por exemplo.

Update: Poderia ser também algum grande variedade / objeto estático. Além disso, com MSVC ++ e GCC, você pode olhar para o gerado montagem para um arquivo, que pode lhe dar algumas dicas (com GCC, é g++ -S foo.cpp, para MSVC ++, é '/ FAs' ). Ou você vai ver muito de instâncias de modelo, em seguida, estes são a razão. Se não, é o tamanho do objeto de objetos static.

Outra possível razão é Link-Time Code Generation, uma opção de VC ++. Isso move o backend do compilador para o vinculador. Isso permite melhores otimizações, mas o arquivo objeto agora tem de conter todos datastructures internos geralmente se passaram entre front e back-end.

Aqui está um uso macro I para ver os valores de tempo de compilação:

template <size_t N> struct compile_time_number { private: typedef int check; };
#define compiler_check_number(N) ((compile_time_number< N >::check)0)

Então vá feliz em tempo de compilação para ver o que símbolos estão ocupando espaço.

Edit: Uma vez que ninguém parece entender isso, eu vou esclarecer: a maneira de usar este objetivo é adicionar compiler_check_number(sizeof(<insert struct or global variable here>)). O compilador vai cuspir fora o tamanho da variável ou struct como um erro de tempo de compilação. Muito raramente é o código a razão para um arquivo de objeto grande.

Eu uso isso o tempo todo para ver o quão grande as coisas são sem ter que executar um depurador.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top