2011-07-01 2 views
-1

나는과 같이 객체를 구성하고있다 :왜 전역 구조의 메모리와 (같은 유형의) 멤버 변수가 전역 변수와 같게 설정 되었습니까?

TestObj::TestObj(const TypedefStruct& myStruct) : m_memberStruct(myStruct){}

구조체는 다음과 같습니다

typedef struct{ short x; short y;} TypedefStruct;합니다. I 글로벌 myStruct의 메모리가 생성자 TestObjm_memberStruct의 멤버 변수로 전달되는 비교할 때 class TestObj .`

의 공개 부재이며, 메모리 내용이 다르다.

PS : 나는과 같이 글로벌 구조체를 초기화하고 있습니다 : TestObj::TypeDefStruct myStruct = {0};

나는 컴파일러 가끔 패드 구조체의 요소는 각 요소를 같은 크기로 만드는 것, 그리고 그 메모리를 비교 방해 할 수 읽었습니다 글로벌 구조체의 "복사본"이지만 동일한 유형의 두 요소 구조체이므로 여기서는 적용되지 않는다고 생각합니다.

상황에 대한 통찰력이 있습니까? 두 요소의 값을 확인하는 것 외에 실제로 메모리를 비교할 수 없다면 메모리 내용이 다른 이유를 이해하고 싶습니다.

+1

* 어떻게 *이 다른가 :

당신은 변수가 쉽게 값을 인식하고보고하기 위해 초기화 시도 할 수 있을까? 두 가지 덤프를 게시 할 수 있습니까? –

+0

더 많은 코드를 표시하십시오. 이것이 일어날 이유가없는 것 같습니다. 또한 두 버전의 메모리 내용은 무엇입니까? –

+0

어떻게 메모리를 비교하고 있습니까? 프로그램에서'memcmp'을 사용하고 있습니까? 아니면 디버거에 메모리를 버리고 있습니까? –

답변

0

컴파일러는 TestObj의 일부이기 때문에 m_memberStruct를 패드 할 수 있습니다. 즉, TestObj에 적절한 정렬을 시도 할 수 있습니다.

+1

그것은 할 수는 있지만 그렇게하지는 않을 것이다. 샘플 프로그램에서 OP가 제공하는 구조는 그가 실행할 가능성이있는 컴파일러에서 패딩되지 않습니다. –

0

데이터를보고 대상 주소를 말하지 않습니까?

myStruct.x = 0xAA; 
myStruct.y = 0xBB; 
관련 문제