读书人

关于《C语言接口与实现》中一句话的理

发布时间: 2012-02-16 21:30:36 作者: rapoo

关于《C语言接口与实现》中一句话的理解问题
在《C语言接口与实现》的第58页中间有这样一段话:
< set bp if ptr is valid >=
if (((unsigned long)ptr)%(sizeof(union align))!=0 || (bp = find(ptr) == NULL || bp->free)
Except_raise(&Assert_Failed, file, line);
其中的测试语句((unsigned long)ptr)%(sizeof(union align))!=0避免了对无效地址调用find函数,这些地址不是最严格的地址边界的倍数,因此不可能是有效的存储块指针”。
就像下面要说的那样,Mem_alloc返回的指针总是俺某个地址的边界调整过的,该地址是以下公用体大小的倍数:
union align{
int i;
long l;
long *lp;
void *p;
void (*fp)(void)
float f;
double d;
long double ld;
}
这种边界调整保证任何类型的数据都可以保存在由Mem_alloc返回的存储块中。如果传递给Mem_free的ptr没有按照这个边界调整,那它可能不在htab中,因此可能是无效的。

这段意思我的理解是,凡是是union align的整数倍的地址才会被存到htab指针数组里,不明白的是,为什么要以union align这个公用体的大小作为尺寸标准呢?

[解决办法]
union align 里面包含了常用的变量类型,基本上在各个平台都可以使用了。

以32位平台为例,通常int long 指针和函数指针 float 是四字节的,double是八字节的,long double是十字节。那么,align就会至少以十字节做边界调整,实际值可能为12或者16字节。

读书人网 >C++

热点推荐