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


Related content

Wet or Dry Mixing Ratios in EAMxx Processes
Wet or Dry Mixing Ratios in EAMxx Processes
Read with this
2022-03-03 All-Hands Presentation Meeting Notes
2022-03-03 All-Hands Presentation Meeting Notes
More like this
Fortran Gotchas
Fortran Gotchas
Read with this
Fortran GPU Refactoring Guide Using Directives
Fortran GPU Refactoring Guide Using Directives
More like this
Development Getting Started Guide
Development Getting Started Guide
Read with this