programing

"number of bytes"를 0으로 설정하고 memcpy()와 memmove()를 호출할 수 있습니까?

goodcopy 2022. 8. 16. 23:09
반응형

"number of bytes"를 0으로 설정하고 memcpy()와 memmove()를 호출할 수 있습니까?

이동/복사할 것이 없을 경우 사례를 처리해야 합니까?memmove()/memcpy()최첨단의 경우

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

아니면 체크하지 않고 기능만 호출할까요?

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

앞의 스니펫에 체크가 필요합니까?

C99 표준(7.21.1/2)부터:

인수가 다음과 같이 선언된 경우size_t n함수의 배열 길이를 지정합니다.n는, 그 함수에의 콜에 0 의 값을 설정할 수 있습니다.이 하위 절의 특정 함수에 대한 설명에서 달리 명시되지 않는 한, 그러한 호출에 대한 포인터 인수는 7.1.4에서 기술된 바와 같이 여전히 유효한 값을 가져야 합니다.이러한 콜에서는, 문자를 검출하는 함수는 오카렌스를 검출하지 않고, 2개의 문자 시퀀스를 비교하는 함수는 제로, 문자를 카피하는 함수는 제로입니다.

따라서 대답은 '아니오'입니다.체크는 불필요합니다(또는 '네'를 통과해도 됩니다).

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

함수 호출 이외의 퍼포먼스 페널리티는 가지고 있지 않습니다.컴파일러가 이러한 함수에 대해 내장 기능/인라인을 지원하는 경우, 추가 체크를 통해 코드가 마이크로 리틀비트로 느려질 수 있습니다.그동안 체크가 이미 이루어졌기 때문입니다.

언급URL : https://stackoverflow.com/questions/3751797/can-i-call-memcpy-and-memmove-with-number-of-bytes-set-to-zero

반응형