유형 말장난어떤 종류의 펀칭인지 & 그 목적은 무엇입니까? 내가 그것을 사용하거나 사용하지 않으면 어떻게됩니까?
두 포인터는 메모리에 동일한 위치를 참조하지만, 그 위치를 서로 다른 유형을 나타내는 포인터 에일리어싱의 형태. 컴파일러는 "puns"를 관련없는 포인터로 처리합니다. 유형 펀치는 두 포인터를 통해 액세스 된 모든 데이터에 대한 종속성 문제를 일으킬 수 있습니다.
무엇을 말하려고합니까?
유형 말장난어떤 종류의 펀칭인지 & 그 목적은 무엇입니까? 내가 그것을 사용하거나 사용하지 않으면 어떻게됩니까?
두 포인터는 메모리에 동일한 위치를 참조하지만, 그 위치를 서로 다른 유형을 나타내는 포인터 에일리어싱의 형태. 컴파일러는 "puns"를 관련없는 포인터로 처리합니다. 유형 펀치는 두 포인터를 통해 액세스 된 모든 데이터에 대한 종속성 문제를 일으킬 수 있습니다.
무엇을 말하려고합니까?
이렇게 말하면, 두 유형의 포인터가 모두 같은 위치를 가리키는 두 개의 포인터가있는 경우에는 punning을 입력합니다. 예 :
// BAD CODE
uint32_t data;
uint32_t* u32 = &data;
uint16_t* u16 = (uint16_t*)&data; // undefined behavior
이 코드는 당신이 (몇 가지 특별한 예외를 제외하고) 호환되지 않는 유형의 포인터를 통해 동일한 메모리 위치에 액세스 할 수 없습니다 때문에 C++ (그리고 C)에 정의되지 않은 동작을 호출합니다. strict aliasing rule을 위반하므로 비공식적으로 "엄격한 앨리어싱 위반"이라고합니다. ++
는// BAD C++ CODE
typedef union
{
uint32_t u32;
uint16_t u16 [2];
} my_type;
my_type mt;
mt.u32 = 1;
std::cout << mt.u16[0]; // access union data through another member, undefined behavior
이것은 또한 C에서 정의되지 않은 동작입니다 (하지만 C에서 완벽하게 정상적으로 허용) :
형 말장난을하는 또 다른 방법은 노동 조합을 통해서이다.
의 가능한 복제는'mt.u16 [0]'을 의미합니다. –
I 포드 유형에 대해 C++에서 유니온 동작이 작동한다고 생각했습니다. –
무엇이 정확하지 않습니까? 이미 답변을 제공하고 있으므로 질문에 쉽게 대답 할 수 있습니다. – user463035818
[[엄격한 앨리어싱 규칙이란 무엇입니까?] (https://stackoverflow.com/questions/98650/what-is-the-strict)와 중복 될 수 있습니다. -aliasing-rule) –
[유니온과 타입 패닝] (https://stackoverflow.com/questions/25664848/unions-and-type-punning) –