C语言面试题更新 2026-08-05

2016年统考真题:给定C语言程序段 for(k=0; k<1000; k++) a[k] = a[k] + 32; 其中数组a和变量k均为int型,int占4字节,数据Cache采用直接映射,数据区容量为1KB,块大小为16B。程序执行前Cache为空。在执行该循环过程中,访问数组a的Cache缺失率约为多少?选项:A. 1.25% B. 2.5% C. 12.5% D. 25%

技术原理

考察说明

考查Cache容量、块大小与访问模式对缺失率的影响,以及计算Cache缺失率的方法。

回答思路

  1. 【回答框架 1】直接映射Cache中,数据区1KB,块大小16B,共64行(块数)。数组a连续存放,int占4B,每个块可放4个int元素。程序按顺序访问a[0]到a[999],每个元素访问一次。
  2. 【回答框架 2】由于块大小16B,访问一个int时会把所在块载入Cache。顺序访问时,每4个int元素对应一个块,首次访问该块时发生缺失,后续3个元素命中。因此每4个int访问产生1次缺失。
  3. 【回答框架 3】块大小16B,4个int共16B,因此每次加载块后连续4次访问中仅第一次缺失,缺失率=1/4=25%。此计算不依赖Cache容量,只要程序访问能容纳于Cache且无冲突。
  4. 【回答框架 4】直接映射的冲突未触发,因为数组顺序访问且容量足够(1KB,64块,共需1000*4=4000B,超过1KB,但顺序访问时先加载的块会被覆盖,但缺失率仍按首次访问每块一次计算,冲突不改变缺失率)。
  5. 【回答框架 5】最终缺失率近似为25%,选择D。注意计算时只统计访问数组a,不包括变量k,k通常存在寄存器中。
  6. 【关键点 1】每个Cache块16B可容纳4个int元素,顺序访问时每4个int产生一次缺失。
  7. 【关键点 2】缺失率=1/4=25%,答案为D。
  8. 【关键点 3】直接映射的缺失率主要受块大小和访问模式影响,容量在本题中不改变缺失率。
  9. 【易错点 1】误以为Cache容量1KB会导致频繁替换而提高缺失率,但顺序访问时每块的首次访问才缺失,冲突未改变结论。
  10. 【易错点 2】误把访问次数算成2000(读和写),但缺失率只按数组元素的访问次数计算,此处为1000次访问。
  11. 【易错点 3】忽略每个块可放4个int,误以为每个int都缺失,得到100%缺失率。