Мой C код:Почему C++ намного быстрее, чем C в этом коде?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void){
char* a = (char*)malloc(200000);
for (int i = 0;i< 100000;i++){
strcat(a,"b");
}
printf("%s",a);
}
Мой C++ кода
#include <iostream>
int main(void){
std::string a = "";
for (int i = 0;i< 100000;i++){
¦ a+="b";
}
std::cout<<a;
}
На моей машине, код C работает примерно 5 секунд, в то время как на моей машине код, С ++ работает в 0.025! секунд.
Теперь код C не проверяет наличие переполнения, не имеет накладных расходов C++, классов и все же на несколько величин медленнее, чем мой код на C++.
Использование gcc/g ++ 6.2.0, скомпилированное с -O3 на малине Pi.
Вероятно, потому что 'strcat()' является библиотечной функцией, которая не будет встроена, тогда как 'std :: string' является (специализацией) шаблоном, поэтому операции - в зависимости от настроек оптимизации - скорее всего, будут встраиваемый. Существует также тот факт, что ваша версия C динамически выделяет гораздо больший буфер, чем требуется, и, в зависимости от доступных ресурсов вашей системы, может замедлить работу. Обратите внимание, что ваш код на C++ не может быть скомпилирован, поскольку '' не требуется определять 'std :: string'. –
Peter
Я бы предположил, что C использует строку с нулевым завершением, поэтому 'strcat' выполняет поиск конца строки. Строка C++ не требует этого, и поэтому конкатенация выполняется намного быстрее. –
@ErwinKalvelagen Wow. Алгоритм краски Шлемиеля на работе –