the cache line
When you ask a librarian for one page, they do not tear that single page out and hand it to you — they bring the whole book to your desk, because fetching is the expensive part and you will probably want nearby pages too. Caches work the same way. When the CPU needs one byte that is not yet cached, it never fetches just that byte. It fetches a whole fixed-size chunk of memory around it, called a cache line.
On almost every modern x86 and ARM chip the cache line is 64 bytes, aligned to a 64-byte boundary in memory (so the line containing address 0x1008 spans 0x1000 to 0x103F). That 64-byte block is the smallest unit that ever moves between DRAM and cache, and between cache levels — there is no such thing as caching a single byte. Read one int (4 bytes) and the 60 neighboring bytes ride along into L1 for free. This is the mechanism behind spatial locality: the cost of the next few accesses to nearby addresses was already paid by the first miss.
Two consequences fall straight out of this. First, laying your data out so that things used together sit in the same line (or in consecutive lines) makes them effectively free to access after the first touch — the heart of data-oriented design. Second, the line is also the unit of coherence between cores, so two threads writing to two different variables that happen to share one 64-byte line will fight over that line even though they never touch the same byte. That accidental contention is false sharing, and it is invisible in the source code.
struct Hot { int a; int b; }; Reading h.a pulls h.b into cache too — both live in one 64-byte line. But if two threads each hammer one of two unrelated counters placed in the same line, performance collapses from false sharing; pad them apart with alignas(64).
The line is the unit of transfer AND of contention: neighbors load for free, but neighbors written by different cores collide.
64 bytes is overwhelmingly common but not guaranteed by anything portable — query it at runtime where it matters; some chips use 128-byte lines or pull two lines as a pair, and assuming a fixed size in code is a bug.