Correct, conformant code is code that performs better, is more optimizable and more testable. Unfortunately, not all code can be executed at compile-time, so we want to write the best possible code we can that runs at run-time. By following best practices and writing idiomatic code, you write programs that the compiler knows how to optimize. You also create a codebase that is easier to maintain, costs less to write, and can be more easily analyzed by static analysis tools and is less error-prone.

During the class, we deeply examine something that C++ has that very few other languages have: a well-defined object life cycle. Understanding this key aspect of C++ is critical to writing clean, maintainable, and efficient C++.

Don't deal with run-time errors, logic errors, and leave performance on the floor with common mistakes that are easily avoided with a deeper understanding of the language.

Goals

Students will:

Learn idiomatic C++ programming patterns

Learn how to spot and avoid undefined behavior

Understand the limitations of what can be optimized

Develop an intuition for what makes good C++ good

Outline

Please note: This outline is subject to change.

Understanding RAII

What does the standard say?

Member variable lifecycle

How and why to limit variable scope

The as-if rule

std::move and std::forward

Optimally passing and returning values

The lifecycle of lambda captures

How the C++ memory model and object lifetime relate

A note about run-time polymorphism

What changes in C++17

Best Practices

C++ Tooling

Prerequisites

I expect you are comfortable with C++ syntax, have used C++, and desire a better intuition for how to write good code.

Format

My classes are highly interactive and have small group exercises, where students share their laptops (1 laptop per 4 students) and discuss the exercise. Come expecting to interact with your fellow students and me. Come also with questions you would like answered.

Following two days: The Fastest Run-time is Compile Time: Taking Advantage of `constexpr` and Templates

Abstract

Doing more work at compile-time means doing less work at run-time. Less work at run-time leads to faster executables. There are limits, however. Unfortunately, we cannot usually move the entire project to compile-time, as most useful programs rely on some user-provided input. In this class, you learn how to identify code that can be moved to compile-time, the limits of compile-time programming, and how to bridge the compile-time and run-time world.

Compile-time programming is more than templates and more than constexpr. With modern techniques, it is the intersection of these features.

If performance is your concern, and it probably is if you program in C++, you want to do as little work at run-time as possible. Come learn the techniques that make that possible.

Goals

Students will:

Learn what is possible with constexpr

Learn the advantages of constexpr

Understand how to use templates to write reusable code

Understand how to balance compile-time and run-time considerations

Outline

Please note: This outline is subject to change.

Introduction

Templates functions and classes

Fold expressions

History and background of C++ constexpr

Limitations of constexpr

Exercises for demonstrating what can or cannot be constexpr

Preparing for constexpr

Developing a constexpr mindset

General advantages to types that fully support constexpr

Disadvantages to constexpr

Using constexpr

What is actually required to be executed at compile time?

Compile-time data verification

Creating compile-time resources

Utilizing compile-time resources

Compile-time sorting

Reducing compile-time impact

Prerequisites

I expect you are actively programming in C++ today and are familiar with template syntax and how templates are used.

Format

My classes are highly interactive and have small group exercises, where students share their laptops (1 laptop per 4 students) and discuss the exercise. Come expecting to interact with your fellow students and me. Come also with questions you would like answered.