Рассмотрим этот фрагмент кода:
bool foo(const std::string& s) {
return s == "hello"; // comparing against a const char* literal
}
bool bar(const std::string& s) {
return s == "hello"s; // comparing against a std::string literal
}
На первый взгляд, похоже, что для сравнения с const char*
требуется меньше ассемблерных инструкций 1 так как использование строкового литерала приведет к созданию std::string
.
(РЕДАКТИРОВАТЬ: как указывалось в ответах, я забыл о том факте, что s.compare(const char*)
будет эффективно вызываться в foo()
, поэтому, конечно, в этом случае не происходит никакого создания на месте. несколько строк ниже.)
Однако, глядя на operator==(const char*, const std::string&)
ссылка:
Все сравнения выполняются через функцию-член
compare()
.
Насколько я понимаю, это означает, что нам все равно нужно будет создать std::string
для того, чтобы выполнить сравнение, поэтому я подозреваю, что издержки в конце будут такими же (хотя они и скрываются при вызове operator==
).
- Какие из сравнений я должен предпочесть?
- Есть ли у одной версии преимущества перед другой (может быть в определенных ситуациях)?
1 Я знаю, что меньшее количество инструкций по сборке не обязательно означает более быстрый код, но я не хочу вдаваться в микропроцессорность здесь.