Эффективная конкатенация строк в C - PullRequest
0 голосов
/ 16 февраля 2010

Вот моя проблема: у меня есть массив, который содержит команду a [1], а затем несколько аргументов команды a [2], a [3], ...

Что мне нужно сделать, это следующее

  • Создать строку, состоящую из cmd и комбинации аргументов E.g.:

cmd arg1 arg2 arg3

  • Выполнить эту командную строку

Вот как я это сделаю (псевдокод):

  1. Предварительно вычислить длину каждого аргумента и сохранить его в массиве
  2. Получить комбинацию (используя научную библиотеку GNU)
  3. Вычисляет размер в байтах, необходимый для выделения строки (длина cmd + 1 + длина arg1 + 1 + argn-1 + 1) (+1 обычно для бланка и в конец для \ 0)
  4. Построить строку с помощью strcat
  5. Выполнить командную строку

Ну, это работает, но мне интересно, действительно ли использование strcat действительно эффективно / правильный способ сделать это.

Есть предложения?

Ответы [ 4 ]

5 голосов
/ 16 февраля 2010

Нет, использование strcat() неэффективно, так как оно должно проходить через строку, чтобы найти конец при каждом вызове.

Гораздо лучше либо сделать все сразу, используя snprintf(), если он у вас есть (и может сжать там свои аргументы), либо сделать это самостоятельно, используя прямые манипуляции с указателями.

Конечно, для того, чтобы на практике это имело значение, вам нужно запускать эту команду очень часто.

2 голосов
/ 16 февраля 2010

Если вы сохранили длины каждой строки компонента, которую вы можете переключить на использование memcpy с правильными смещениями указателя вместо использования strcat, которому не нужно будет находить этот конец строки и каждый тест source char против '\0', но кроме этого, вы можете сделать намного больше, чтобы значительно ускорить создание объединенного элемента.

1 голос
/ 16 февраля 2010

strcat(), как и все функции работы со строками из стандартной библиотеки, неэффективны. это связано с тем, что строки хранятся в C, а именно с нулевым символом в конце, поэтому каждая функция должна найти конец строки, перебирая каждый символ.

в любом случае, вы делаете преждевременную оптимизацию: несколько вызовов strcat () здесь будут выполняться очень быстро по сравнению с выполнением команды, поэтому вам не нужно беспокоиться об эффективности вашего способа объединения.

прежде чем оптимизировать часть кода, вы должны показать, что это узкое место и что оптимизация действительно улучшит время выполнения. в большинстве случаев оптимизировать не нужно: это просто не стоит потраченного времени.

0 голосов
/ 16 февраля 2010

Я бы сделал это с sprintf .

...