Немножко про оптимизации и C++ 2/2.
2. Про RVO/NRVO писал ранее: t.me/thisnotes/198.
Рядом с этой темой можно посмотреть доклад про move-only C++ design.
3. Про девиртуализацию писал Женя: t.me/cxx95/88.
==============================
4. strlen elision.
Как известно, функция strlen работает за длину строки. Соответственно, если вы используете её в циклах:
for (int i = 0; i < strlen(str); ++i) {…}Вы автоматом ловите квадрат в асимптотике. Потому хорошей практикой является выносить вот эту границу справа в отдельную переменную:
for (int i = 0, end = strlen(str); i < end; ++i) {}По-хорошему так делать и для итераторов, потому что операция получения end() у вашего контейнера может быть довольно тяжёлой (но ещё лучше понимать ограничения вашего контейнера и выбирать из конкретной ситуации). Но компиляторы не глупые: сами умеют иногда подобные вещи оптимизировать. Самый простой пример, это когда код вроде:
int main() {
return std::strlen(“hi”);
}компилятор сделает вам:
main: # @main
mov eax, 2
retНу это база.
Недавно на собесе меня попросили написать
strlen. Потом ещё каким-то образом попросили это дело поускорять. Кек, что таким ещё занимаются. Хотя конечно, если погуглить, можно найти что-нибудь вроде такого или такого. Так что может и не без оснований, но лучше я вкину вот такую статью про полезность собеседований подобного рода. Как писали на каком-то сабреддите:
Optimize strlen by not using it.