C++Primer第五版第五章练习5.13

/*
练习5.13:
下面显示的每个程序都含有一个常见的编程错误,指出错误在哪里,然后修改它们:
(a)unsigned aCnt=0, eCnt=0, iouCnt=0;
char ch=next_text();
switch(ch){
	case 'a':aCnt++;//缺少break, 程序会执行至swith结尾处
	case 'e':eCnt++;//缺少break
	default:iouCnt++;//缺少break
}

(b)unsigned index=some_value();
switch(index){
	case 1:
		int ix=get_value();//修改:取消初始化,改为赋值:int ix;ix=get_value();
		ivec[ix]=index;
		break;
	default:
		ix=ivec.size()-1;//C++语言规定,不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置
		ivec[ix]=index;//缺少一个break
}

(c)unsigned evenCnt=0, oddCnt=0;
int digit=get_num() % 10;
switch(digit){
	case 1, 3, 5, 7, 9://case标签必须是整型常量表达式。有逗号运算符的不行。
		oddCnt++;
		break;
	case 2, 4, 6, 8, 10:
		evenCnt++;
		break;
}

(d)unsigned ival=512, jval=1024, kval=4096;
unsigned bufsize;
unsigned swt=get_bufCnt();
switch(swt){
	case ival:		//case标签必须是整型常量表达式, 变量不行
		bufsize = ival * sizeof(int);
		break;
	case jval:
		bufsize = jval * sizeof(int);
		break;
	case kval:
		bufsize = kval * sizeof(int);
		break;
}
*/
#include "TouWenJian_5.h"
/*(c)程序修改后
int main()
{
	unsigned evenCnt=0, oddCnt=0;
	int digit;
	cin>>digit;
	digit %= 10;
	switch(digit){
		case 1: case 3: case 5: case 7: case 9:
			oddCnt++;
			break;
		case 2: case 4: case 6: case 8: case 10:
			evenCnt++;
			break;
	}
	cout<<"evenCnt:\t"<<evenCnt<<endl;
	cout<<"oddCnt:\t\t"<<oddCnt<<endl;
	cout<<endl;
	return 0;
}
*/
//(d)程序修改后
int main()
{
//	unsigned ival=512, jval=1024, kval=4096;//程序编译不通过
//	const unsigned ival=512, jval=1024, kval=4096;//编译通过
	constexpr unsigned ival=512, jval=1024, kval=4096;//编译通过
	unsigned bufsize;
	unsigned swt;
	cin>>swt;
	switch(swt){
		case ival:
			bufsize = ival * sizeof(int);
			break;
		case jval:
			bufsize = jval * sizeof(int);
			break;
		case kval:
			bufsize = kval * sizeof(int);
			break;
	}
	cout<<bufsize<<endl;
	cout<<endl;
	return 0;
}

### CSAPP 第五章 课后习题 解答与解析 针对计算机系统结构和编程方面的深入理解,CSAPP 的第五章通常涵盖了存储层次结构的内容。这一章节对于缓存的工作原理、性能优化以及如何编写高效的程序有着详细的介绍。 #### 缓存工作原理分析 在讨论具体题目之前,了解缓存的基本概念至关重要。缓存是一种高速的小容量存储设备,位于处理器核心内部或靠近CPU的位置,用于临时保存频繁访问的数据副本,从而减少主存访问次数并提高整体执行效率[^1]。 #### 题目实例:计算命中率 考虑一道典型的关于缓存命中的问题:“假设有一个两路组相联映射的直接映射缓存(cache),共有8个block位置可用,每块(block)可以容纳4个字(word)。如果按照地址0x0C开始连续读取32个整数(int),请问会发生多少次cache miss?” 为了求解此类问题,需要掌握以下几点: - **Cache配置参数**:包括总行数、关联度、块大小等。 - **寻址方式**:确定tag bits, index bits 和 offset bits的数量。 - **替换策略**:LRU (Least Recently Used), FIFO (First In First Out) 或者其他算法的选择会影响最终的结果。 通过上述信息可得出结论,在给定条件下,当首次加载数据时会产生一次miss;之后由于局部性原理的作用,后续请求可能会命中已存在的缓存项,除非遇到新的页面边界导致再次发生缺失。 ```c // C代码模拟简单的直接映射缓存行为 #include <stdio.h> #define CACHE_SIZE 8 // Cache block数量 #define BLOCK_WORDS 4 // 每Block含有的Word数目 int cache[CACHE_SIZE][BLOCK_WORDS]; unsigned int tags[CACHE_SIZE]; void access(unsigned long addr){ unsigned int tag = (addr >> 5); unsigned int idx = ((addr << 27)>>29); if(tags[idx]!=tag || !tags[idx]){ printf("Miss\n"); // 更新Tag及相应Block内容... tags[idx]=tag; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值