ELSEIF
Your brief EB
498 stories from 219 feeds 1270 clusters Refreshed 22 minutes ago next pull 04:58

LANGUAGES Signal 195

Type Punning in C and C++

Illustration only Photo by Bruno Martins on Unsplash

Type punning is interpreting memory as different types between reads and writes.

WHY IT MATTERS

Type punning is essential for serialisation, network protocols, and low-level hardware access. The distinction between C and C++ in type punning is important for engineers to understand. The compiler may optimise away code that uses pointer casts for type punning.

Written by elseif from the cluster below · every claim links back to a source

The three things worth knowing

01

Type punning is interpreting memory as different types between reads and writes.

02

In C, unions and memcpy are safe ways to type pun.

03

In C++, the compiler assumes different types never alias each other.

THE READ

What the cluster adds up to.

ORIGINAL ANALYSIS

Type punning is a technique where memory is interpreted as different types between reads and writes. This is crucial for tasks such as serialisation, network protocols, and low-level hardware access. Engineers often use type punning to manipulate data at a fine granularity, but it comes with risks. The compiler may optimise away code that uses pointer casts for type punning, leading to silent failures.

In C, unions and memcpy are safe ways to perform type punning. A union allows writing as one type and reading as another, which is defined behaviour. memcpy is also safe and can be optimised to a single instruction. These methods provide a way to type pun safely without relying on undefined behaviour. However, pointer casts, while convenient, are technically undefined behaviour under strict aliasing rules. They may work on most compilers but can lead to optimisation issues.

In C++, type punning is more restricted due to the language's stricter type system. The compiler assumes that different types never alias each other, which can lead to optimisations that break code relying on type punning. This difference between C and C++ is important for engineers to understand, as it affects how they can safely manipulate memory. The as-if rule in C++ gives the compiler more latitude to break things, making it even more crucial to use safe methods like unions and memcpy.

The practical rule for type punning is to use unions or memcpy in C and avoid pointer casts. In C++, the same rule applies, but with additional caution due to the compiler's assumptions about type aliasing. Engineers should be aware of these differences and choose their methods carefully to avoid silent failures and optimisation issues. The bug described in the article highlights the importance of understanding these nuances, as a simple pointer cast led to unexpected behaviour in a hot loop.

Written by elseif from the cluster below · checked for specifics the sources never contained

THE CLUSTER

Same story, 1 feed.

ORDERED BY FIRST SEEN
pwkf.org via Hacker News Type Punning in C and C++ Open ↗