C++ Runtime: Verified
static char instance_memory[sizeof(Logger)]; static uint8_t guard = 0; // 0 = uninitialized, 1 = initializing, 2 = done if (guard == 2) goto done; if (__cxa_guard_acquire(&guard)) new (instance_memory) Logger(); __cxa_guard_release(&guard); __cxa_atexit(destroyer, instance_memory, __dso_handle);
(simplified for a class hierarchy A <- B ): c++ runtime
done: return instance_memory;
Report ID: CPP-RT-2024-01 Date: April 14, 2026 Author: Systems Software Research Division Subject: Structure, Execution Flow, and Overhead of the C++ Runtime Environment 1. Executive Summary The C++ runtime is the set of software components that support the execution of a compiled C++ program beyond the raw machine code generated by the compiler. Unlike C, which has a relatively minimal runtime, C++ requires substantial behind‑the‑scenes machinery to implement core language features: dynamic initialization of globals, exception handling, run‑time type information (RTTI), new / delete operators, and stack unwinding. This report dissects the C++ runtime into its constituent parts, traces the execution flow from _start to main and beyond, analyzes the cost of each runtime feature, and examines implementation variations across major compilers (GCC/Clang, MSVC) and operating systems. 2. Components of the C++ Runtime The C++ runtime is not monolithic. It consists of several logical layers: This report dissects the C++ runtime into its
| Component | Responsibility | Typical Implementation | |-----------|----------------|------------------------| | | Program startup, atoi , printf , heap base (malloc/free) | libc.so / msvcrt.dll | | C++ ABI Runtime | Constructor/destructor calling conventions, RTTI structures, exception personality routines | libstdc++ (GCC), libc++abi (LLVM), msvcrt + VCRuntime (MSVC) | | C++ Standard Library Runtime | std::vector , std::string , std::cout , std::thread | libstdc++.so , libc++.so , MSVC STL | | Language Support Library | new / delete operators, __cxa_* exception APIs, __gxx_personality_v0 | Part of ABI runtime | | Compiler‑Generated Helpers | Thunk functions for virtual calls, dynamic cast helpers, guard variables for static locals | Injected by compiler (e.g., __cxa_guard_acquire ) | It consists of several logical layers: | Component
vtable for B: [0] offset_to_top = 0 [1] typeinfo pointer -> typeinfo for B [2] A::foo() thunk (if overriding) vtable for A: [0] offset_to_top = 0 [1] typeinfo pointer -> typeinfo for A
When dynamic_cast<B*>(a_ptr) is performed, the runtime reads the vtable of the object to obtain the type_info of the most derived type and checks if it derives from B .