Pergunta

Aqui está o meu problema: eu tenho uma matriz, que contém um comando a [1], seguido por vários comando args a [2], a [3], ...

O que eu preciso fazer é o seguinte

  • Crie uma string, consistindo no CMD e uma combinação de args, por exemplo:

cmd arg1 arg2 arg3

  • Execute essa corda de comando

Veja como eu fiz isso (pseudo-código):

  1. Pré -computar o comprimento de cada arg e armazená -lo em uma matriz
  2. Obtenha uma combinação (usando a biblioteca científica da GNU)
  3. Calcule o tamanho em bytes necessários para alocar a string (comprimento de cmd + 1 + comprimento de arg1 + 1 + argn-1 + 1) (o +1 geralmente para o espaço em branco e no final do 0)
  4. Construa a string usando STRCAT
  5. Execute a corda de comando

Bem, funciona, mas eu me pergunto se o STRCAT que deliberadamente é realmente eficiente/a maneira certa de fazê -lo.

Alguma sugestão?

Foi útil?

Solução

Não, usando strcat() não é eficiente, pois ele precisa passar pela string para encontrar o fim cada vez que você chama.

Muito melhor fazer tudo de uma vez usando snprintf() Se você o tiver (e pode espremer seus argumentos lá) ou fazer você mesmo usando a manipulação direta do ponteiro.

Obviamente, para que isso importa na prática, você precisa executar esse comando com muita frequência.

Outras dicas

Se você armazenou os comprimentos de cada string de componente que você pode mudar para usar memcpy com as compensações corretas do ponteiro em vez de usar strcat que não terá que encontrar esse extremo da string e o teste de cada fonte de char contra '\0', mas fora isso, não há muito mais o que você pode fazer para tornar a criação de um concatenado significativamente mais rápido.

strcat(), bem como todas as funções de manipulação de string da biblioteca padrão, são ineficientes. Isso se deve à maneira como as cordas são armazenadas em C, a saber, terminado zero, portanto, cada função deve encontrar o final da string, iterando sobre cada caractere.

De qualquer forma, você está fazendo uma otimização prematura: as múltiplas chamadas STRCAT () aqui serão executadas muito rápidas em comparação com a execução do comando; portanto, você não deve se preocupar com a eficiência da sua maneira de concatenar.

Antes de otimizar parte de um código, você deve mostrar que é um gargalo e que a otimização realmente melhorará o tempo de execução. Na maioria dos casos, não há necessidade de otimizar: simplesmente não vale o tempo gasto.

Eu faria isso com sprintf.

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