π Definition
Structure padding is the insertion of unused bytes by the compiler to ensure data alignment in memory.
β οΈ It's automatically done by the compiler to make access to variables faster and efficient.
π¦ Real-Life Analogy:
Imagine you are placing boxes (data) into shelves (memory). Some boxes are large and some are small.
To align all boxes properly and allow faster access, you may leave empty space (padding) between them.
π Why Padding Happens?
Modern processors read memory in chunks (2, 4, 8 bytes). If variables are not properly aligned (starting from suitable boundaries), performance drops.
π Example :Padded Structure
<div class="infographic-cpad">
<style>
.infographic-cpad {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--code-bg: #1e1e2e;
--code-text: #d4d4e0;
--syn-keyword: #c586c0;
--syn-comment: #6a9955;
--pad-color: #b45309;
--pad-soft: #fdf0dc;
}
.infographic-cpad[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--code-bg: #0d0d14;
--code-text: #d4d4e0;
--pad-color: #e0a458;
--pad-soft: #3a2c14;
}
.infographic-cpad {
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
background: var(--paper);
color: var(--ink);
font-family: 'Inter', -apple-system, sans-serif;
padding: 0 clamp(1rem, 4vw, 2.25rem) 1.25rem;
}
.infographic-cpad *, .infographic-cpad *::before, .infographic-cpad *::after {
box-sizing: border-box;
}
.infographic-cpad h1 {
font-family: 'Fraunces', Georgia, serif;
font-weight: 600;
font-size: clamp(1.3rem, 3.5vw, 1.7rem);
margin: 1.25rem 0 0.2rem;
text-align: center;
}
.infographic-cpad .subhead { color: var(--ink-soft); font-size: 0.85rem; margin-bottom: 1.1rem; text-align: center; }
.infographic-cpad .code-panel {
background: var(--code-bg);
color: var(--code-text);
border-radius: 8px;
padding: 0.65rem 0.9rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.82rem;
line-height: 1.6;
margin-bottom: 1.1rem;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.infographic-cpad .code-panel .code-line { display: block; white-space: pre; }
.infographic-cpad .syn-keyword { color: var(--syn-keyword); }
.infographic-cpad .syn-comment { color: var(--syn-comment); }
.infographic-cpad table.pad-table {
border-collapse: collapse;
width: 100%;
font-size: 0.85rem;
margin-bottom: 1rem;
}
.infographic-cpad table.pad-table th, .infographic-cpad table.pad-table td {
border: 1px solid var(--line);
padding: 0.5rem 0.6rem;
text-align: left;
font-family: 'IBM Plex Mono', monospace;
}
.infographic-cpad table.pad-table th {
background: var(--paper-alt);
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.02em;
color: var(--ink-soft);
font-family: 'Inter', sans-serif;
}
.infographic-cpad table.pad-table tr { cursor: pointer; transition: background 0.15s; }
.infographic-cpad table.pad-table tr:hover td { background: var(--accent-soft); }
.infographic-cpad table.pad-table tr.is-active td { background: var(--accent-soft); }
.infographic-cpad table.pad-table tr.pad-row td { color: var(--pad-color); font-style: italic; }
.infographic-cpad table.pad-table tr.pad-row:hover td,
.infographic-cpad table.pad-table tr.pad-row.is-active td { background: var(--pad-soft); }
.infographic-cpad table.pad-table tr.total-row td { font-weight: 700; color: var(--ink); font-family: 'Inter', sans-serif; font-style: normal; background: transparent; cursor: default; }
.infographic-cpad .byte-strip { display: flex; gap: 0.3rem; margin-bottom: 1.3rem; flex-wrap: wrap; justify-content: center; }
.infographic-cpad .byte-box {
width: 2.2rem;
height: 2.2rem;
display: flex;
align-items: center;
justify-content: center;
border: 2px solid var(--line);
border-radius: 6px;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.68rem;
color: var(--ink-soft);
background: var(--paper-alt);
transition: border-color 0.2s, background 0.2s, color 0.2s;
}
.infographic-cpad .byte-box.is-a { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); font-weight: 700; }
.infographic-cpad .byte-box.is-pad { border-color: var(--pad-color); background: var(--pad-soft); color: var(--pad-color); border-style: dashed; }
.infographic-cpad .byte-box.is-b { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); font-weight: 700; }
.infographic-cpad .byte-box.is-dim { opacity: 0.35; }
.infographic-cpad .takeaway {
font-size: 0.82rem; color: var(--ink-soft);
margin-top: 0.5rem; border-top: 1px solid var(--line); padding-top: 0.9rem;
}
.infographic-cpad .takeaway strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-cpad * { transition: none !important; }
}
</style>
<div class="code-panel">
<span class="code-line"><span class="syn-keyword">struct</span> MyStruct {</span>
<span class="code-line"> <span class="syn-keyword">char</span> a; <span class="syn-comment">// 1 byte</span></span>
<span class="code-line"> <span class="syn-keyword">int</span> b; <span class="syn-comment">// 4 bytes</span></span>
<span class="code-line">};</span>
</div>
<table class="pad-table" id="pad-table">
<tr><th>Offset</th><th>Content</th><th>Size</th></tr>
<tr class="mem-row" data-target="a"><td>0</td><td>a (char)</td><td>1 byte</td></tr>
<tr class="pad-row" data-target="pad"><td>1 β 3</td><td>padding</td><td>3 bytes</td></tr>
<tr class="mem-row" data-target="b"><td>4 β 7</td><td>b (int)</td><td>4 bytes</td></tr>
<tr class="total-row"><td colspan="2">sizeof(struct MyStruct)</td><td>8 bytes</td></tr>
</table>
<div class="byte-strip" id="byte-strip"></div>
<p class="takeaway"><strong>Why:</strong> <code style="font-family:'IBM Plex Mono',monospace;">int b</code> needs to start on a 4-byte boundary, so the compiler inserts 3 unused bytes after <code style="font-family:'IBM Plex Mono',monospace;">a</code> to push it from offset 1 to offset 4.</p>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-cpad')
|| document.querySelector('.infographic-cpad');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
function $(sel) { return wrapper.querySelector(sel); }
const BYTES = ['a', 'pad', 'pad', 'pad', 'b', 'b', 'b', 'b'];
const strip = $('#byte-strip');
const boxes = BYTES.map((kind, i) => {
const box = document.createElement('div');
box.className = 'byte-box is-' + kind;
box.dataset.kind = kind;
box.textContent = i;
strip.appendChild(box);
return box;
});
function highlightTarget(target) {
boxes.forEach(b => b.classList.toggle('is-dim', target && b.dataset.kind !== target));
}
const rows = wrapper.querySelectorAll('#pad-table tr[data-target]');
rows.forEach(row => {
row.addEventListener('click', () => {
const isActive = row.classList.contains('is-active');
rows.forEach(r => r.classList.remove('is-active'));
if (isActive) {
highlightTarget(null);
} else {
row.classList.add('is-active');
highlightTarget(row.dataset.target);
}
});
});
})();
</script>π« Can Padding Be Avoided?
Yes, by reordering members from largest to smallest:
struct PackedStruct {
int b; // 4 bytes
char a; // 1 byte
};Now:
No padding required between
bandaPadding may still be added at the end (for alignment in arrays)
π Size may now be 5 or 8 bytes, depending on compiler/platform.
π§ͺ Use of #pragma pack
You can force the compiler to pack the structure with no padding:
<div class="infographic-cpad">
<style>
.infographic-cpad {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--code-bg: #1e1e2e;
--code-text: #d4d4e0;
--syn-keyword: #c586c0;
--syn-comment: #6a9955;
--pad-color: #b45309;
--pad-soft: #fdf0dc;
}
.infographic-cpad[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--code-bg: #0d0d14;
--code-text: #d4d4e0;
--pad-color: #e0a458;
--pad-soft: #3a2c14;
}
.infographic-cpad {
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
background: var(--paper);
color: var(--ink);
font-family: 'Inter', -apple-system, sans-serif;
padding: 0 clamp(1rem, 4vw, 2.25rem) 1.25rem;
}
.infographic-cpad *, .infographic-cpad *::before, .infographic-cpad *::after {
box-sizing: border-box;
}
.infographic-cpad h1 {
font-family: 'Fraunces', Georgia, serif;
font-weight: 600;
font-size: clamp(1.3rem, 3.5vw, 1.7rem);
margin: 1.25rem 0 0.2rem;
text-align: center;
}
.infographic-cpad .subhead { color: var(--ink-soft); font-size: 0.85rem; margin-bottom: 1.1rem; text-align: center; }
.infographic-cpad .chip-row { display: flex; justify-content: center; gap: 0.45rem; margin-bottom: 1rem; }
.infographic-cpad .chip {
all: unset;
cursor: pointer;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.76rem;
font-weight: 600;
padding: 0.4rem 0.8rem;
border-radius: 20px;
border: 1px solid var(--line);
color: var(--ink-soft);
transition: background 0.2s, color 0.2s, border-color 0.2s;
}
.infographic-cpad .chip:hover { border-color: var(--accent); }
.infographic-cpad .chip.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }
.infographic-cpad .code-panel {
background: var(--code-bg);
color: var(--code-text);
border-radius: 8px;
padding: 0.65rem 0.9rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.82rem;
line-height: 1.6;
margin-bottom: 1.1rem;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.infographic-cpad .code-panel .code-line { display: block; white-space: pre; }
.infographic-cpad .syn-keyword { color: var(--syn-keyword); }
.infographic-cpad .syn-comment { color: var(--syn-comment); }
.infographic-cpad table.pad-table {
border-collapse: collapse;
width: 100%;
font-size: 0.85rem;
margin-bottom: 1rem;
}
.infographic-cpad table.pad-table th, .infographic-cpad table.pad-table td {
border: 1px solid var(--line);
padding: 0.5rem 0.6rem;
text-align: left;
font-family: 'IBM Plex Mono', monospace;
}
.infographic-cpad table.pad-table th {
background: var(--paper-alt);
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.02em;
color: var(--ink-soft);
font-family: 'Inter', sans-serif;
}
.infographic-cpad table.pad-table tr { cursor: pointer; transition: background 0.15s; }
.infographic-cpad table.pad-table tr:hover td { background: var(--accent-soft); }
.infographic-cpad table.pad-table tr.is-active td { background: var(--accent-soft); }
.infographic-cpad table.pad-table tr.pad-row td { color: var(--pad-color); font-style: italic; }
.infographic-cpad table.pad-table tr.pad-row:hover td,
.infographic-cpad table.pad-table tr.pad-row.is-active td { background: var(--pad-soft); }
.infographic-cpad table.pad-table tr.total-row td { font-weight: 700; color: var(--ink); font-family: 'Inter', sans-serif; font-style: normal; background: transparent; cursor: default; }
.infographic-cpad .byte-strip { display: flex; gap: 0.3rem; margin-bottom: 1.3rem; flex-wrap: wrap; justify-content: center; }
.infographic-cpad .byte-box {
width: 2.2rem;
height: 2.2rem;
display: flex;
align-items: center;
justify-content: center;
border: 2px solid var(--line);
border-radius: 6px;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.68rem;
color: var(--ink-soft);
background: var(--paper-alt);
transition: border-color 0.2s, background 0.2s, color 0.2s;
}
.infographic-cpad .byte-box.is-a { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); font-weight: 700; }
.infographic-cpad .byte-box.is-pad { border-color: var(--pad-color); background: var(--pad-soft); color: var(--pad-color); border-style: dashed; }
.infographic-cpad .byte-box.is-b { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); font-weight: 700; }
.infographic-cpad .byte-box.is-dim { opacity: 0.35; }
.infographic-cpad .takeaway {
font-size: 0.82rem; color: var(--ink-soft);
margin-top: 0.5rem; border-top: 1px solid var(--line); padding-top: 0.9rem;
}
.infographic-cpad .takeaway strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-cpad * { transition: none !important; }
}
</style>
<h1>π Struct Padding</h1>
<p class="subhead">Click a row to see exactly which bytes it covers.</p>
<div class="code-panel" id="pad-code"></div>
<table class="pad-table" id="pad-table">
<tr><th>Offset</th><th>Content</th><th>Size</th></tr>
</table>
<div class="byte-strip" id="byte-strip"></div>
<p class="takeaway" id="pad-takeaway"></p>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-cpad')
|| document.querySelector('.infographic-cpad');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
function $(sel) { return wrapper.querySelector(sel); }
const codePanel = $('#pad-code');
const table = $('#pad-table');
const strip = $('#byte-strip');
const takeaway = $('#pad-takeaway');
const DATA = {
code: '<span class="code-line"><span class="syn-keyword">#pragma pack(1)</span></span>' +
'<span class="code-line"><span class="syn-keyword">struct</span> MyStruct {</span>' +
'<span class="code-line"> <span class="syn-keyword">char</span> a;</span>' +
'<span class="code-line"> <span class="syn-keyword">int</span> b;</span>' +
'<span class="code-line">};</span>' +
'<span class="code-line"><span class="syn-keyword">#pragma pack()</span></span>',
rows: [
{ target: 'a', offset: '0', content: 'a (char)', size: '1 byte', cls: 'mem-row' },
{ target: 'b', offset: '1 β 4', content: 'b (int)', size: '4 bytes', cls: 'mem-row' }
],
total: '5 bytes',
bytes: ['a', 'b', 'b', 'b', 'b'],
takeaway: '<strong>What changed:</strong> pack(1) tells the compiler "don\u2019t align anything" β <code style="font-family:\'IBM Plex Mono\',monospace;">b</code> starts right after <code style="font-family:\'IBM Plex Mono\',monospace;">a</code> at offset 1, no padding at all. Smaller, but slower to access on some CPUs.'
};
function renderTable(rows, total) {
table.innerHTML = '<tr><th>Offset</th><th>Content</th><th>Size</th></tr>';
rows.forEach(r => {
const tr = document.createElement('tr');
tr.className = r.cls;
tr.dataset.target = r.target;
tr.innerHTML = '<td>' + r.offset + '</td><td>' + r.content + '</td><td>' + r.size + '</td>';
table.appendChild(tr);
});
const totalRow = document.createElement('tr');
totalRow.className = 'total-row';
totalRow.innerHTML = '<td colspan="2">sizeof(struct MyStruct)</td><td>' + total + '</td>';
table.appendChild(totalRow);
}
function renderStrip(bytesArr) {
strip.innerHTML = '';
bytesArr.forEach((kind, i) => {
const box = document.createElement('div');
box.className = 'byte-box is-' + kind;
box.dataset.kind = kind;
box.textContent = i;
strip.appendChild(box);
});
wireRowClicks();
}
function wireRowClicks() {
const boxes = Array.from(strip.children);
const rows = table.querySelectorAll('tr[data-target]');
function highlightTarget(target) {
boxes.forEach(b => b.classList.toggle('is-dim', target && b.dataset.kind !== target));
}
rows.forEach(row => {
row.addEventListener('click', () => {
const isActive = row.classList.contains('is-active');
rows.forEach(r => r.classList.remove('is-active'));
if (isActive) {
highlightTarget(null);
} else {
row.classList.add('is-active');
highlightTarget(row.dataset.target);
}
});
});
}
codePanel.innerHTML = DATA.code;
renderTable(DATA.rows, DATA.total);
renderStrip(DATA.bytes);
takeaway.innerHTML = DATA.takeaway;
})();
</script>π― Why Does Padding Matter?
Impacts memory consumption
Changes
sizeof(struct)unexpectedlyCritical in:
Embedded systems
Network protocols
File I/O (binary file layout)
π What Are Bit Fields?
A bit field allows you to allocate a specific number of bits to a structure member instead of using the entire data type.
This helps save memory when you only need small values, such as 0/1 (true/false) or numbers with a limited range.
π€ Syntax
struct Flags {
unsigned int flag1 : 1;
unsigned int flag2 : 1;
unsigned int count : 4;
};π Explanation
Here,
flag1 : 1β Uses 1 bitflag2 : 1β Uses 1 bitcount : 4β Uses 4 bits
So, the total space used is:
1 + 1 + 4 = 6 bitsinstead of allocating a full unsigned int for each member.
π Why Use unsigned?
Bit fields are usually declared as unsigned because they often store values that are never negative.
Using unsigned:
Uses all the bits to store the value.
Prevents unexpected behavior caused by negative numbers.
Provides a clear range of positive values.
For example:
A 1-bit unsigned field can store only 0 or 1.
A 4-bit unsigned field can store values from 0 to 15.
<div class="infographic-cperm">
<style>
.infographic-cperm {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--code-bg: #1e1e2e;
--code-text: #d4d4e0;
--syn-keyword: #c586c0;
--syn-func: #dcdcaa;
--syn-string: #ce9178;
}
.infographic-cperm[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--code-bg: #0d0d14;
--code-text: #d4d4e0;
}
.infographic-cperm {
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
background: var(--paper);
color: var(--ink);
font-family: 'Inter', -apple-system, sans-serif;
padding: 0 clamp(1rem, 4vw, 2.25rem) 1.25rem;
}
.infographic-cperm *, .infographic-cperm *::before, .infographic-cperm *::after {
box-sizing: border-box;
}
.infographic-cperm h1 {
font-family: 'Fraunces', Georgia, serif;
font-weight: 600;
font-size: clamp(1.3rem, 3.5vw, 1.7rem);
margin: 1.25rem 0 0.2rem;
text-align: center;
}
.infographic-cperm .subhead { color: var(--ink-soft); font-size: 0.85rem; margin-bottom: 1.1rem; text-align: center; }
.infographic-cperm .code-panel {
background: var(--code-bg);
color: var(--code-text);
border-radius: 8px;
padding: 0.65rem 0.9rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.78rem;
line-height: 1.55;
margin-bottom: 1rem;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.infographic-cperm .code-panel .code-line { display: block; white-space: pre; }
.infographic-cperm .code-panel .code-line.is-highlight {
background: rgba(91, 141, 239, 0.22);
box-shadow: inset 3px 0 0 var(--accent);
}
.infographic-cperm .syn-keyword { color: var(--syn-keyword); }
.infographic-cperm .syn-func { color: var(--syn-func); }
.infographic-cperm .syn-string { color: var(--syn-string); }
.infographic-cperm .field-row { display: flex; align-items: center; gap: 1rem; flex-wrap: wrap; margin-bottom: 1rem; justify-content: center; }
.infographic-cperm .field-item { display: flex; align-items: center; gap: 0.4rem; font-family: 'IBM Plex Mono', monospace; font-size: 0.85rem; }
.infographic-cperm .field-item input[type="checkbox"] { width: 1.15rem; height: 1.15rem; accent-color: var(--accent); }
.infographic-cperm .run-btn {
all: unset; cursor: pointer;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.8rem; font-weight: 600;
padding: 0.45rem 1rem;
border-radius: 999px;
background: var(--accent);
color: #fff;
margin-bottom: 1rem;
display: block;
text-align: center;
}
.infographic-cperm .run-btn:hover { opacity: 0.88; }
.infographic-cperm .run-btn:disabled { opacity: 0.5; cursor: default; }
.infographic-cperm .p-box {
border: 2px solid var(--line);
background: var(--paper-alt);
border-radius: 10px;
padding: 0.7rem 0.9rem;
margin-bottom: 1rem;
transition: border-color 0.3s, background 0.3s;
}
.infographic-cperm .p-box.is-active { border-color: var(--accent); background: var(--accent-soft); }
.infographic-cperm .p-box .p-title { font-family: 'IBM Plex Mono', monospace; font-size: 0.75rem; font-weight: 700; color: var(--ink-soft); margin-bottom: 0.45rem; }
.infographic-cperm .p-box.is-active .p-title { color: var(--accent); }
.infographic-cperm .p-bits { display: flex; gap: 0.6rem; justify-content: center; }
.infographic-cperm .p-bit { text-align: center; }
.infographic-cperm .p-bit .pb-name { font-family: 'IBM Plex Mono', monospace; font-size: 0.68rem; color: var(--ink-soft); margin-bottom: 0.25rem; }
.infographic-cperm .p-bit .pb-val {
width: 2.2rem; height: 2.2rem;
display: flex; align-items: center; justify-content: center;
border: 2px solid var(--line);
border-radius: 6px;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.95rem; font-weight: 700;
background: var(--paper);
color: var(--ink-soft);
transition: border-color 0.25s, background 0.25s, color 0.25s;
}
.infographic-cperm .p-bit.is-filled .pb-val { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.infographic-cperm .console {
background: var(--code-bg);
color: var(--code-text);
border-radius: 8px;
padding: 0.7rem 0.9rem;
font-family: 'IBM Plex Mono', monospace;
font-size: 0.8rem;
line-height: 1.55;
white-space: pre;
min-height: 4rem;
}
.infographic-cperm .takeaway {
font-size: 0.82rem; color: var(--ink-soft);
margin-top: 1.3rem; border-top: 1px solid var(--line); padding-top: 0.9rem;
}
.infographic-cperm .takeaway strong { color: var(--ink); }
@media (prefers-reduced-motion: reduce) {
.infographic-cperm * { transition: none !important; }
}
</style>
<h1>π Full Code Example</h1>
<p class="subhead">Three 1-bit flags, initialized and printed.</p>
<div class="code-panel" id="pm-code">
<span class="code-line"><span class="syn-keyword">struct</span> Permissions {</span>
<span class="code-line"> <span class="syn-keyword">unsigned int</span> read : 1;</span>
<span class="code-line"> <span class="syn-keyword">unsigned int</span> write : 1;</span>
<span class="code-line"> <span class="syn-keyword">unsigned int</span> execute : 1;</span>
<span class="code-line">};</span>
<span class="code-line"> </span>
<span class="code-line" data-line="init"><span class="syn-keyword">struct</span> Permissions p = {1, 0, 1};</span>
<span class="code-line"> </span>
<span class="code-line" data-line="p1"><span class="syn-func">printf</span>(<span class="syn-string">"Read: %u\n"</span>, p.read);</span>
<span class="code-line" data-line="p2"><span class="syn-func">printf</span>(<span class="syn-string">"Write: %u\n"</span>, p.write);</span>
<span class="code-line" data-line="p3"><span class="syn-func">printf</span>(<span class="syn-string">"Execute: %u\n"</span>, p.execute);</span>
</div>
<div class="field-row">
<span class="field-item">read <input type="checkbox" id="pm-read" checked></span>
<span class="field-item">write <input type="checkbox" id="pm-write"></span>
<span class="field-item">execute <input type="checkbox" id="pm-execute" checked></span>
</div>
<button class="run-btn" id="pm-run">βΆ Run</button>
<div class="p-box" id="pm-pbox">
<div class="p-title">struct Permissions p</div>
<div class="p-bits">
<div class="p-bit" id="pm-bit-read"><div class="pb-name">read</div><div class="pb-val">β</div></div>
<div class="p-bit" id="pm-bit-write"><div class="pb-name">write</div><div class="pb-val">β</div></div>
<div class="p-bit" id="pm-bit-execute"><div class="pb-name">execute</div><div class="pb-val">β</div></div>
</div>
</div>
<div class="console" id="pm-console"></div>
<p class="takeaway"><strong>All three fields</strong> pack into a single unsigned int β three separate booleans stored in 3 bits instead of 3 whole ints.</p>
</div>
<script>
(function () {
const wrapper = document.currentScript.closest('.infographic-cperm')
|| document.querySelector('.infographic-cperm');
const bodyAttr = document.body.getAttribute('data-darkmode');
let dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
const match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
function $(sel) { return wrapper.querySelector(sel); }
const readInput = $('#pm-read'), writeInput = $('#pm-write'), executeInput = $('#pm-execute');
const runBtn = $('#pm-run');
const codePanel = $('#pm-code');
const codeLines = codePanel.querySelectorAll('.code-line[data-line]');
const pBox = $('#pm-pbox');
const bitRead = $('#pm-bit-read'), bitWrite = $('#pm-bit-write'), bitExecute = $('#pm-bit-execute');
const consoleEl = $('#pm-console');
function highlight(id) {
codeLines.forEach(l => l.classList.toggle('is-highlight', l.dataset.line === id));
}
function resetVisual() {
pBox.classList.remove('is-active');
[bitRead, bitWrite, bitExecute].forEach(el => {
el.classList.remove('is-filled');
el.querySelector('.pb-val').textContent = 'β';
});
consoleEl.textContent = '';
highlight(null);
}
function runSequence() {
runBtn.disabled = true;
resetVisual();
const r = readInput.checked ? 1 : 0;
const w = writeInput.checked ? 1 : 0;
const x = executeInput.checked ? 1 : 0;
const steps = [
() => {
highlight('init');
pBox.classList.add('is-active');
bitRead.classList.add('is-filled'); bitRead.querySelector('.pb-val').textContent = r;
bitWrite.classList.add('is-filled'); bitWrite.querySelector('.pb-val').textContent = w;
bitExecute.classList.add('is-filled'); bitExecute.querySelector('.pb-val').textContent = x;
},
() => { highlight('p1'); consoleEl.textContent = 'Read: ' + r; },
() => { highlight('p2'); consoleEl.textContent += '\nWrite: ' + w; },
() => { highlight('p3'); consoleEl.textContent += '\nExecute: ' + x; },
() => { highlight(null); runBtn.disabled = false; }
];
let i = 0;
function next() {
if (i >= steps.length) return;
steps[i]();
i++;
setTimeout(next, 420);
}
next();
}
runBtn.addEventListener('click', runSequence);
})();
</script>π‘ Where Are Bit Fields Used?
Bit fields are commonly used in:
File permission flags
Hardware and device registers
Microcontrollers and embedded systems
Data compression
Network protocols
π Real-Life Analogy
Imagine a board with 32 light switches, but you only need 3 to control a device.
Using a full int for each switch wastes space.
With bit fields, you use only the switches you need, saving memory.
π§ Limitations of Bit Fields
Limitation | Description |
|---|---|
Bit addressability | You canβt take the address of a bit field |
Portability | Behavior may vary between compilers |
Overflow | No automatic error if assigned value exceeds allowed bits |
π§ Bit Fields vs Padding
Feature | Structure Padding | Bit Fields |
|---|---|---|
Purpose | Align data for access | Compress data |
Who does it? | Compiler automatically | Programmer explicitly |
Use case | Optimize CPU access | Optimize memory usage |
Example | Between | Save 1-bit flags |