117

当我实际上没有东西可以移动/复制memmove()/memcpy()作为边缘情况时,我是否需要处理?

int numberOfBytes = ...
if( numberOfBytes != 0 ) {
    memmove( dest, source, numberOfBytes );
}

还是我应该直接调用函数而不检查

int numberOfBytes = ...
memmove( dest, source, numberOfBytes );

是否需要检查前一个片段?

4

2 回答 2

159

来自 C99 标准 (7.21.1/2):

如果声明为的参数size_t n指定函数数组的长度,则n在调用该函数时可以将值设为零。除非在本小节中对特定函数的描述中另有明确说明,否则此类调用中的指针参数仍应具有有效值,如 7.1.4 中所述。在这样的调用中,定位字符的函数找不到出现,比较两个字符序列的函数返回零,复制字符的函数复制零字符。

所以答案是否定的;检查是没有必要的(或者是的;你可以通过零)。

于 2010-09-20T13:32:11.930 回答
6

正如@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;
}

除了函数调用之外,您甚至不应该有任何性能损失;如果编译器支持此类函数的内在函数/内联,则额外的检查甚至可能会使代码变慢一点点,因为此时检查已经完成。

于 2010-09-20T13:33:08.080 回答