2016-08-23 2 views
0
void func(char c) {} 
void func(std::string) {} 

int main() { 
    std::string s("HelloWorld"); 

    // method 1 
    func(s); 

    // method 2 
    for(std::size_t i = 0; i < s.size(); i++) { 
     func(s[i]); 
    } 
} 

Почему происходит передача значения при повторном вызове OK? не эффективно ли оно копировать то же количество символов в конце? Или они на самом деле то же самое, и я что-то упускаю?Передача строки по значению против передачи каждого символа по значению

+1

Какова цель фактического кода Youre письменной форме и имеют проблемы с? Должна ли функция обрабатывать только один символ за раз или обрабатывать целую строку? –

+2

Вы также должны подсчитать количество вызовов функций в двух случаях. А также сделайте некоторые измерения, если вам интересно, что быстрее. И, конечно же, не забывайте про передачу ссылок. –

ответ

1

Копия std::string будет выполнять выделение (за исключением оптимизации небольших строк), тогда как передача char в качестве параметра, вероятно, будет выполнена регистром.

Pass std::string по константной ссылке

void func(const std::string&); 
+0

Не все системы имеют регистры, достаточные для передачи значений в регистры. Например, как 32-битная архитектура x86. Но это не самая большая сделка, самая большая сделка - это количество * вызовов функций *. Есть большая разница. –

+0

Моя проблема заключалась в том, что вам нужно скопировать любое значение как минимум два раза. Например, если вы назначаете char ячейке в массиве char, тогда вам нужно использовать оператор присваивания, который я предполагаю, примет значение char по значению, а затем снова скопирует это значение в нужную ячейку. – mkmostafa

+0

@mkmostafa Какова ваша * актуальная * проблема? Это одна из «эффективности» или оптимизации? Копирование символа тривиально и будет заметным только в том случае, если вы сделаете это несколько миллионов раз за короткий промежуток времени. Я думаю, вам нужно прочитать о [проблема XY] (http://xyproblem.info/) и подумать о том, как это относится к вашему вопросу. –

1

Проходя каждый символ строки по значению функции так же, как не-хорошо, как передавая всю строку по значению. То есть, в обоих случаях вы должны предпочесть альтернативу, когда вся строка не должна быть скопирована или пройдена, если можно.

1

Передача одного символа по значению в порядке, так как размер символа меньше размера указателя, который необходимо передать по ссылке. Кроме того, никакие конструкторы копий не используются для символа.

(Это не означает, что вызов функции для каждого символа в строке всегда ОК)

Смежные вопросы