Skip to content

C++

Guidelines

Overview

Pass by reference vs. pass by pointer

It seems that the consensus is to "use references when you can and pointers when you have to". More specifically:

  • Use "pass by reference" unless you have a good reason not to.
  • Use "pass by pointer" if NULL is a possible value.

Sources:

Passing by reference also works well with std::unique_ptr and std::shared_ptr. In this case, the function can be implemented irrespective of how the user manages the object lifetime.

As usual, use a * if you need to express null (no widget), otherwise prefer to use a &; and if the object is input-only, write const widget* or const widget&.

Sources:

Application-binary interface (ABI)

The C++ ABI is reasonably stable, but when a non-backwards compatible change is introduced, all libraries need to be recompiled in order to be able to work with the new ABI.

Awesome

General

  • protobuf — C++ does not really have "data classes" in the same way that you have data classes in Python or Kotlin, but you can use protobufs instead.

Linear algebra

  • ATLAS - Automatically Tuned Linear Algebra Software. Provides full BLAS and certain LAPACK routines, which are being tuned to the computer platform at the compilation time. Slower than vendor-provided BLAS such as MKL.
  • BLAS - Basic Linear Algebra Subprograms.
  • LAPACK - LAPACK (Linear Algebra PACKage) provides routines for solving systems of simultaneous linear equations, least-squares solutions of linear systems of equations, eigenvalue problems, and singular value problems. It runs on single processor only.
  • OpenBLAS - (Source Code)
  • MKL - Intel BLAS/LAPACK implementation.

Numerical Libraries

  • ArrayFire - A general purpose GPU library. - (Source Code) BSD
  • Blaze - Blaze is an open-source, high-performance C++ math library for dense and sparse arithmetic. With its state-of-the-art Smart Expression Template implementation Blaze combines the elegance and ease of use of a domain-specific language with HPC-grade performance, making it one of the most intuitive and fastest C++ math libraries available.
  • Deal.II - Solve partial differential equations using the finite element method. (Source Code) C++ GPL
  • Eigen - Used by TensorFlow :). (Source Code)
  • FLENS - FLENS extends C++ for matrix/vector types that are ideally suited for numerical linear algebra. Matrix/vector types for dense linear algebra. Generic implementation of BLAS / LAPACK.
  • GSL - The GNU Scientific Library (GSL) is a numerical library for C and C++ programmers. The library provides a wide range of mathematical routines such as random number generators, special functions and least-squares fitting. While GSL is not parallel, it is reasonably thread safe and its routines should be callable from parallel code sections. One can also link a parallel BLAS library such as MKL or ACML and utilize the shared memory parallelism they provide. Has Python bindings: pygsl.
  • PETSc - Solvers for partial and ordinary differential equations. Parallel vectors / matrices. - (Source Code)
  • Root - A modular scientific software framework. It provides all the functionalities needed to deal with big data processing, statistical analysis, visualisation and storage. It is mainly written in C++ but integrated with other languages such as Python and R.
  • Trilinos - Shared memory data structures. Includes packages of other code. (Source Code)

Image processing

  • CImg - The CImg Library is a small, open-source, and modern C++ toolkit for image processing. - (Source Code).

Utilities

  • nm my_binary | c++filt | grep VAR to get names.
  • readelf

Build system

Make

  • Use .PHONY targets when the script does not produce a file with the particular name.
  • Use '\' run multiple bash commands using the same bash interpreter.
  • https://www.gnu.org/software/make/manual/html_node/index.html

CMake

Meson

Ninja

Good alternative to Make for building projects. CMake can easily be configured to generate Ninja build files instead of Make.

Testing

  • Boost.Test - Boost
  • Catch - A modern, C++-native, header-only, framework for unit-tests, TDD and BDD. C++ Automated Test Cases in Headers. Boost
  • Google Test ★★★ - Most used by companies? 2-clause BSD