返回信息流各位大侠,今天我参加研究生面试,老师给我出了题,让我写个内存拷贝的函数,然后做白盒测试,函数,我已经知道了,不知道哪个高手能告诉我怎样做些测试 数据?谢谢
函数:
// 考虑重叠的状况
void* _memcpy(void* dest, void* src, int len)
{
if(!dest || !src || !len || dest == src)
return dest;
char* pdest = static_cast<char*>(dest);
char* psrc = static_cast<char*>(src);
// dest 在 src + len 范围内
if(pdest > psrc && pdest < (psrc + len))
{
// 先备份被覆盖部分
int need = psrc + len - pdest;
int offset = pdest - psrc;
char* pcache = new char[need];
int i = 0;
for (i = 0; i < need; ++i)
pcache[i] = psrc[offset + i];
// 拷贝起始部分
for (i = 0; i < offset; ++i)
pdest[i] = psrc[i];
// 拷贝剩余部分
for (i = 0; i < need; ++i)
pdest[offset + i] = pcache[i];
delete[] pcache;
}
else
{
for (int i = 0; i < len; ++i)
pdest[i] = psrc[i];
}
return dest;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #36577同步于 2010/3/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于内存拷贝
wjs19871023
2010/3/12镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
最简单的:写测试,覆盖所有可能的执行代码
【 在 wjs19871023 (1234) 的大作中提到: 】
: 各位大侠,今天我参加研究生面试,老师给我出了题,让我写个内存拷贝的函数,然后做白盒测试,函数,我已经知道了,不知道哪个高手能告诉我怎样做些测试 数据?谢谢
: 函数:
: // 考虑重叠的状况
: ...................
重叠的话,倒过来复制不可以吗?
if (dst>src && dst<src+len) {
dst+=len;
src+=len;
while(len--) {
*(dst--)=*(src--);
}
}
考虑所有if在成立或不成立时的情况,while循环与不循环的情况,
for在两个端点和不循环时的情况
对所有情况进行组合,然后写test case覆盖所有的组合情况即可
当然了,可以挑个真子集进行覆盖
【 在 wang6120 (wang6120) 的大作中提到: 】
: 怎么个写法?
: 怎么发个写法
已经用if判断了
if (dst==src) break;
if (dst>src) {
dst+=len; src+=len;
while (len--) {
*(dst--) = *(src--)
}
} else {
while (len--) {
*(dst++) = *(src++)
}
}
怕的是cache和换页问题。
还要效率的话,貌似duff's device不错。
send(to, from, count)
register short *to, *from;
register count;
{
register n=(count+7)/8;
switch(count%8){
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while(--n>0);
}
}
当然还有利用余数,逐word拷贝这样的bt优化方法(还有麻烦的对齐问题)。
【 在 ericyosho 的大作中提到: 】
: 倒过来不行,如果src在后,des在前,这不一样会覆盖么。
有不需要O(n)的方法嘛
【 在 ericyosho (ericyosho) 的大作中提到: 】
: 我问个很白痴的问题,为啥不能用个空间复杂度为O(n)的算法呢?
: 直接拷贝两次不就妥了么?