一个可以验证两个内存块绝不重叠的断言
2006-10-22 10:39
295 查看
验证两个内存块绝不重叠的断言, 用在像memcpy函数这样的场合最适合不过了, 因为在两个重叠的内存块之间拷贝数据, 结果是没有意义的,
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
assert(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
...
}
上面的断言很巧妙,只用了一条语句, 它的思想在于:
把两个内存块比作两辆在停车处排成一行等候的轿车,
如果一辆车的后保险杠在另一辆车的前保险杠之前, 两辆车就不会重叠
这个断言我在<<编程精粹>>中看到的, 写在这里作一个笔记。
void memcpy(void* pvTo, void* pvFrom, size_t size)
{
assert(pbTo>=pbFrom+size || pbFrom>=pbTo+size);
...
}
上面的断言很巧妙,只用了一条语句, 它的思想在于:
把两个内存块比作两辆在停车处排成一行等候的轿车,
如果一辆车的后保险杠在另一辆车的前保险杠之前, 两辆车就不会重叠
这个断言我在<<编程精粹>>中看到的, 写在这里作一个笔记。
相关文章推荐
- 验证任意一个大于4并且小于500的偶数都可以拆分成两个素数之和
- 40.验证哥德巴赫猜想:一个大于2的偶数总可以分解成两个素数的和
- 验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和。请输入一个偶数,将其表示成两个素数之和。
- JavaScript解决一个带验证的Form两个Submit事件(一个页面保持不动【AJAX实现】,一个页面提交并跳转)的场景
- 每天一道算法题(二):给定数组Arr和一个整数aim,请返回哪两个位置的数可以加出aim来。
- C#Winform两个panel重叠只能显示一个。。
- 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程: ax2 + bx + c = 0 的两个解。 提示:计算平方根可以调用math.sqrt()函数:
- .实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA
- 声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中 添加数据,每一个线程为数组添加 3 个数据即可。
- 有两个瓶子一个瓶承5升水一个瓶子成3升水,那怎么可以成四升水呢
- 牛牛和15朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成26份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地,作为牛牛最好的朋友,你希望牛牛取得的田地价值和尽可能大,你知道这个值最大可以是多少吗? 输入两个整数n和m(1≤n,m≤75)表示田地的大小,接下来n行,每行包括m个0-9之间的数字,表示每块
- 二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。 对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 小易想知道最多可以放多少块蛋糕在网格盒子里。 输入描述: 每组数组包含网格长宽W,
- 哥德巴赫猜想: 任何一个大于2的偶数都可以拆分为两个素数的和
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- //3.实现一个函数,可以左旋字符串中的k个字符。 //ABCD左旋一个字符得到BCDA //ABCD左旋两个字符得到CDAB
- 有n个长为m+1的字符串, 如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接, 问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。
- 1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1
- 为ListView添加适配器,使list可以显示一个ImageView和两个textview
- 实现一个数值加法函数,返回两个数字的和。要求能进行参数验证,若参数不是数字或为空则抛出异常。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。