C++ Programming Best Practices in Scientific Computing

C++ Programming Best Practices in Scientific Computing

This is a presentation by Alfredo Correa (LLNL) on good C++ programming practices.  . 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