간단하게 복사 가능한 객체를 생성하기 위해 "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, &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 중국어 웹사이트의 기타 관련 기사를 참조하세요!