sha*_*oth 91 c c++ pointers memcpy memmove
当我无法移动/复制memmove()/ memcpy()作为边缘情况时,我是否需要处理案例
int numberOfBytes = ...
if( numberOfBytes != 0 ) {
memmove( dest, source, numberOfBytes );
}
Run Code Online (Sandbox Code Playgroud)
或者我应该在没有检查的情况下调用该函数
int numberOfBytes = ...
memmove( dest, source, numberOfBytes );
Run Code Online (Sandbox Code Playgroud)
是否需要检查前片段?
Mik*_*our 131
从C99标准(7.21.1/2):
声明为的参数
size_t n指定函数数组的长度,在n调用该函数时可以为零.除非在本子条款中对特定函数的描述中另有明确说明,否则此类调用上的指针参数仍应具有有效值,如7.1.4中所述.在这样的调用中,定位字符的函数不会发生,比较两个字符序列的函数返回零,复制字符的函数复制零个字符.
所以答案是否定的; 检查是没有必要的(或者是;你可以传递零).
正如@You所说,该标准指定memcpy和memmove应该可以毫无问题地处理这种情况。因为它们通常以某种方式实现
void *memcpy(void *_dst, const void *_src, size_t len)
{
unsigned char *dst = _dst;
const unsigned char *src = _src;
while(len-- > 0)
*dst++ = *src++;
return _dst;
}
Run Code Online (Sandbox Code Playgroud)
除了函数调用之外,您甚至不应有任何性能损失;如果编译器支持此类函数的内在函数/内联,则额外的检查甚至可能使代码的速度稍慢一些,因为该检查已经在同一时间完成了。