Сегодня я поигрался с некоторым временным кодом и обнаружил, что при назначении строкового литерала std :: string он был примерно на 10% быстрее (с короткой 12-символьной строкой, так что, как правило, еще большая разница для больших строк) сделать это с литералом известной длины (используя оператор sizeof), чем нет. (Протестировано только с компилятором VC9, поэтому я думаю, что другие компиляторы могут сделать это лучше).
std::string a("Hello World!");
std::string b("Hello World!", sizeof("Hello World!");//10% faster in my tests
Теперь причина, по которой я подозреваю, заключается в том, что он должен вызывать strlen (VC9 собирается в сборку, которая не является моей сильной стороной, поэтому я не могу быть уверен на 100%), чтобы получить длину строки, затем выполните то же, что и во втором случае. в любом случае.
Учитывая, как долго был std :: string, и как часто встречается первый случай (особенно если вы включаете операторы +, =, + = и т. Д. И эквивалентные методы) в программы реального мира, почему он не оптимизируется первый случай во второй? Это также кажется очень простым, просто сказать, что это объект std :: basic_string и литерал, скомпилировать его так, как если бы оно было написано как b?