C++ Programming Best Practices in Scientific Computing
This is a presentation by Alfredo Correa (LLNL) on good C++ programming practices. C++ techniques from AFQMC.pdf. Alfredo is supported in part by the QMCPACK ECP project, which also supports Nichols A. Romero (Unlicensed).
(Reproducing two of the main slides)
When is a good idea to use OO (virtual, new,>, etc)? (spoiler: almost never to do math or a simulation)
Perhaps if:
- Immutable (but polymorphic) state
- Shared/singleton objects/representations of logic
- `In-the-heap-anyway'
- Open hierarchies (e.g. open behavior, cross compilation-boundaries)
- Exceptions (std::runtime_error)
- Resources (std::pmr::memory_resource)
- Devices (std::iostream)
Perhaps not if:
- - - - Value Semantics
- Mutability
- Local reasoning
Remember, virtual was never used in the STL and it still went a long way:
$ grep -R virtual /usr/include/c++/*
Conclusions
- Try not to add new virtual functions
- Give your arithmetic types value semantics
- Use constructors and assignment instead of (pointer-) factories
- (make * functions are ok)
- OO can coexists with Generic Programming and slowly fade away
- Use the stack for objects, or be stack-friendly
- Use dynamic memory as an internal implementation detail
- Use algorithms (100+ STL algorithms)\
- (chances are your loops are in essence existing algorithms)
- Use containers, even custom containers/iterators/pointers
- Use dynamic memory generically through allocators