> 백엔드 개발 > C++ > 'memcpy'는 C에서 간단하게 복사 가능한 개체를 구성하는 유효한 방법입니까?

'memcpy'는 C에서 간단하게 복사 가능한 개체를 구성하는 유효한 방법입니까?

Patricia Arquette
풀어 주다: 2024-11-09 17:39:02
원래의
971명이 탐색했습니다.

Is

간단하게 복사 가능한 객체를 생성하기 위해 "memcpy"를 사용할 때의 우려 사항

C에서 "memcpy"를 사용하여 간단하게 복사 가능한 객체를 생성하는 타당성 복사 가능한 유형은 논쟁의 주제였습니다. 이 문서에서는 이 코드를 둘러싼 미묘한 차이와 불확실성을 살펴봅니다.

#include <cstdlib>
#include <cstring>

struct T   // trivially copyable type
{
    int x, y;
};

int main()
{
    void *buf = std::malloc( sizeof(T) );
    if ( !buf ) return 0;

    T a{};
    std::memcpy(buf, &amp;a, sizeof a);
    T *b = static_cast<T *>(buf);

    b->x = b->y;

    free(buf);
}
로그인 후 복사

"memcpy""의 불확실한 개체 수명

질문의 핵심은 " *b"는 수명이 시작된 개체와 그렇다면 이 수명이 시작되는 시점을 나타냅니다. C 표준은 이에 대해 침묵합니다. Matter.

암시적 객체 생성에 대한 제안 및 현재 상태

이 모호성을 해결하기 위해 제안 p0593이 제시되어 하위 수준 객체 조작 중에 암시적 객체 생성을 옹호합니다. "malloc" 및 "memcpy"와 같은 작업. 제안된 이 변경 사항은 이러한 시나리오에 대해 정의된 동작을 제공하지만 아직 공식적으로는 제공되지 않았습니다. 검토되었습니다.

C 14 표준 초안의 지침

C 14 초안 표준 섹션 1.8 [intro.object]에 따라 객체는 주로 정의를 통해 생성됩니다. -표현식 또는 특정 구현 프로세스는 간단하게 복사 가능한 유형과 관련된 섹션 3.9 [basic.types]에서 복사를 지정합니다. 해당 객체의 바이트는 값이 적절하게 복원된 경우 허용됩니다.

진행 중인 토론 및 대체 접근 방식

"ub 메일링 리스트"는 다음과 같은 활발한 토론을 촉진했습니다. 이 주제는 유형을 통한 복사 방지에 중점을 두고 있습니다. punning.

결론

"memcpy"를 사용하여 사소하게 복사 가능한 개체를 "구성"하는 문제는 C 표준 내에서 해결되지 않은 상태로 남아 있어 정의되지 않은 잠재적인 동작의 여지가 남아 있습니다. p0593과 같은 진행 중인 토론과 제안은 이 문제를 명확히 하고 해결하여 C의 하위 수준 객체 조작에 대한 더 큰 확실성을 가져오는 것을 목표로 합니다.

위 내용은 'memcpy'는 C에서 간단하게 복사 가능한 개체를 구성하는 유효한 방법입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿