Skip to main content

struct-layout-analysis

Measure and fix C struct layout in BIND 9 — pahole on the build's DWARF for sizes, padding holes, and cacheline boundaries, plus the house cacheline-padding idiom. Use when asked about struct size, padding, false sharing, or when adding/reordering members in hot structures.

来源信息

仓库
isc-projects/bind9
最近来源活动
2026年7月14日 11:40
检测到的 SKILL.md 语言
英语
星标
780
分支
187

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
struct-layout-analysis
description
Measure and fix C struct layout in BIND 9 — pahole on the build's DWARF for sizes, padding holes, and cacheline boundaries, plus the house cacheline-padding idiom. Use when asked about struct size, padding, false sharing, or when adding/reordering members in hot structures.
# Struct layout: measure with pahole, pad with a multiplier ## Measuring — pahole, never throwaway sizeof programs The developer build (`-Og -ggdb`) already carries DWARF; read it instead of compiling sizeof/offsetof snippets: ```sh pahole -C <struct_name> build/lib/dns/libdns*.so.p/<file>.c.o pahole --holes -C <struct_name> <object-or-binary> ``` pahole prints member offsets, padding holes, total size, and cacheline boundaries — complete layout information the compiler already computed, with no boilerplate to write. Any object file under `build/` or the final binary works as input. ## Padding to cachelines — union arm with a plain multiplier Pad a struct to a whole number of cache lines with a union arm sized by a plain multiplier, always paired with a static assert: ```c struct foo { union { struct { /* members */ }; uint8_t __padding[ISC_OS_CACHELINE_SIZE * 6]; }; }; STATIC_ASSERT(sizeof(struct foo) % ISC_OS_CACHELINE_SIZE == 0, "struct foo size must be a multiple of the cacheline size"); ``` Pick the smallest `n` that fits; when members outgrow the arm to a non-multiple size, the STATIC_ASSERT fires and prompts a bump of `n`. Do NOT use the enumerated-sizeof trailing formula `uint8_t __padding[CACHELINE - (sizeof(a) + sizeof(b) + ...) % CACHELINE]` (the historical qpzone style): it must enumerate every member's sizeof, so adding a member silently miscounts unless the formula is updated in lockstep. The multiplier form has no such coupling and is easier to read.
在 GitHub 查看