- Compiler optimizations: /O3
- Link Time Optimization: /LTO
- Fast-Math(dangerous)
- Unity Builds
- Profile Guided optimizations
- Static Linking??
- LLVM Bolt
constexpr constinit consteval(C++23) const static global variables/functions
[[noreturn]] => saves calls [[likely]] => reorders branches [[assume(condition)]] => UB if condition is false __restrict => disallowes aliasing [[gnu::pure]] => pure math functions, not supported in MSVC
using std::optional instead of nullable pointer use smart pointers if stealing, use rvalue ref if need copy, use plain type if modified, use lvalue ref if cheap to copy, use plain type if only reading, use const lvalue ref if using a range and continous, use std::span if can be arbitrary range, use std::ranges::*** if it needs to be a specific container, use the container otherwise take iterator base use std::string_view(readonly) for invocables, try: - std::invocable<\Args...> auto&& x - return_t(*x)(Args...) - std::move_only_function&&<\return_t(Args...)> x - std::function<\return_t(Args...)> x
dont allocate in loops dont catch exceptions by value(use const lvalue ref) use const lvalue refs also in range for loops, lambda captures and structured bindings provide rvalue accessors T&& value() &&, C++23 provides this auto&& self