3)下面的函数被用来计算某个整数的平方,它能实现预期设计目标吗?如果不能,试回答存在什么问题:
1 2 3 4 | int square( volatile int *ptr)
{
return ((*ptr) * (*ptr));
}
|
3)这段代码是个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,
编译器将产生类似下面的代码:[
写直通导致忽略高速缓存从公共存储器直接读取值,在没有互斥保护的SMP争用情况下,地址指向的值不确定]
1 2 3 4 5 6 7 | int square( volatile int * &ptr) //这里参数应该申明为引用,不然函数体里只会使用副本,外部没法更改
{
int a,b;
a = *ptr;
b = *ptr;
return a*b;
}
|
由于*ptr的值可能在两次取值语句之间发生改变,因此a和b可能是不同的。结果,这段代码可能返回的不是你所期望的平方值!正确的代码如下:
1 2 3 4 5 6 | long square( volatile int *ptr)
{
int a;
a = *ptr;
return a*a;
}
|
posted on 2020-01-13 11:22
长戟十三千 阅读(308)
评论(0) 编辑 收藏 引用 所属分类:
编程技巧随笔