免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: rainballdh
打印 上一主题 下一主题

[C] C语言接口与实现第二章习题求讲解 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-10-01 13:32 |只看该作者
emule 上也没有。。。。

论坛徽章:
0
12 [报告]
发表于 2007-10-01 17:48 |只看该作者
原帖由 chsw1984 于 2007-9-30 17:57 发表
#define isgoodptr(p)  ( p ) ? (!( (unsigned long)(p) % 8 ) ) : 0

usage : assert( isgoodptr(p) );

不具备通用性实际使用情况与编译器和操作系统有关

没弄明白,请详解释

论坛徽章:
0
13 [报告]
发表于 2007-10-02 12:10 |只看该作者
1、 if(p) 对于 NULL 指针返回 FALSE
2、将指针与 8 取模 如果是8 的倍数返回 0 否则返回 数值
3、对于C  0为 FALSE 其余为 TRUE
4、对于 指针可能是一负数所以 要强制转换为 无符号整数。

论坛徽章:
0
14 [报告]
发表于 2007-10-02 18:53 |只看该作者
原帖由 chsw1984 于 2007-10-2 12:10 发表
1、 if(p) 对于 NULL 指针返回 FALSE
2、将指针与 8 取模 如果是8 的倍数返回 0 否则返回 数值
3、对于C  0为 FALSE 其余为 TRUE
4、对于 指针可能是一负数所以 要强制转换为 无符号整数。

谢谢,但是这个是第二个问题,第一个问题如何解决?

论坛徽章:
0
15 [报告]
发表于 2007-10-02 21:46 |只看该作者
原帖由 rainballdh 于 2007-10-2 18:53 发表

谢谢,但是这个是第二个问题,第一个问题如何解决?


这两个其实是同一个问题,关于为什么 分配内存的指针一般是以 4字节的 倍数开头 而 double 的指针要以 8的倍数开头 这与计算机的一种机制有关系,对于应用开发者来说 我们称这个问题为 字节序对齐。

对于CPU来说 一次性读取内存的长度是有限的,一般来说目前32位的CPU一次性可以读取32位,也就是内存的4个字节,同时CPU只从内存的4字节的整数倍的位置开始读取。以int 类型来说,CPU可以一次性将整型变量从内存取出来。而如果内存的地址不是以四个字节倍数开始则CPU需要读取两次甚至更多此才能将对应的操作数读取到内存。而众所周知内存的读取是龟速的,会严重损害系统性能。至于32 位CPU为什么要以
4的倍数读取这涉及到cpu的设计原理,具体的情况请参考 计算机原理的课程学习。典型的是MIPS CPU对于整数类型的内存地址如果不以4的倍数开始会造成系统异常,顺便抱怨一下垃圾的MIPS的CPU。
当然目前64位的CPU的字节对齐已经是8字节了,所以64位的CPU相对来说不能有效的利用内存空间。

但是利用上述原理来检验系统分配内存的指针 是很不科学的,跟编译器,CPU平台以及代码有关,所以算不得通用代码。

论坛徽章:
0
16 [报告]
发表于 2007-10-02 22:14 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
17 [报告]
发表于 2007-10-03 15:26 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
18 [报告]
发表于 2007-10-03 22:49 |只看该作者
首先要说的呢是兄弟的硬件知识非常的扎实,可以从Linux中抠出这一大段的代码。。有机会学习内核的话还要向你多请教。。
其次是,关于MIPS 对字节序对齐的要求 是否合理 ,已经严重跑题了。需要的话可以单独讨论。
还有一点是并不是所有的操作系统都有处理这个异常,比如我们再用的vxworks 就没有。。。

[ 本帖最后由 chsw1984 于 2007-10-3 22:53 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2007-10-05 10:19 |只看该作者
8楼给出的答案,我觉得可以把8改为sizeof(long),一般指针的长度根据编译器和机器的不同会有变化,但通常等于sizeof(long)

论坛徽章:
0
20 [报告]
发表于 2007-10-05 18:39 |只看该作者
原帖由 feelsmile 于 2007-10-5 10:19 发表
8楼给出的答案,我觉得可以把8改为sizeof(long),一般指针的长度根据编译器和机器的不同会有变化,但通常等于sizeof(long)

题目要求的是double 的大小 long 的大小是4,而且对于64位的CPU long 的指针分配也必须是 8字节对齐。所以说这种方法检查内存是否有效时不恰当的,和编译器,CPU和设置都有关系。把这道题忘了吧,没有实际意义。

[ 本帖最后由 chsw1984 于 2007-10-5 18:55 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP