C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[41824] Re:c문법 질문입니다.
evergreen [heredity] 861 읽음    2005-09-07 00:58
오류가 날 것 같은 코드 였는데, 확인해 보니 그렇지 않군요.

typedef struct{
  int a;
  int b;
} c;

(unsigned long)&((c*)0)->b;
에서 &, ->의 연산자 우선순위의 혼돈을 피하기 위해
(unsigned long) &(((c*)0)->b);
로 바꾸고, 이것을 다시 분리하면

c *p1   = (c *) 0;
int *pn = &(p1->b);               // 여기서 p1을 참조하므로 오류가 발생될 줄 알았는데 확인해 보니 아니군요. OTL...
Caption = (int) pn;                // 결과 : 4

이것의 어셈블리 코드를 보면

c *p1   = (c *) 0;
  // xor edx, edx
  // mov [ebp-0x70], edx          p1 <-- 0을 넣습니다.

int *pn = &(p1->b);   
  // mov ecx, [bp-0x70];          ecx <-- p1의 값을 불러옵니다.
  // add ecx, 0x04                ecx <-- b의 위치(4)를 더합니다.
  // mov [ebp-0x74], ecx          pn <-- ecx

하지만
int b2 = p1->b;
를 추가시
  // mov eax, [bp-0x70];          eax <-- p1의 값을 불러옵니다.
  // mov edx, [ebp + 0x04]        edx <-- p1->b의 값을 구함 (여기서 Access violation 오류 발생)
  // mov [ebp - 0x78], edx        b2 <-- p1->b의 값 저장.
와 같이 되어 오류가 발생됨.

결론은 신성기 님이 말씀하신데로 메모리를 줄이고, 실행속도 등을 향상시키기 위한 것이라고
판단됩니다.

- heredity -


ssb 님이 쓰신 글 :
: typedef struct{
:   int a;
:   int b;
: }c;
:
: (unsigned long)&((c*)0)->b; //<-이게 의미하는게 b의 위치를 말하는거 같은데 이해가 잘 안되네요.

+ -

관련 글 리스트
41813 c문법 질문입니다. ssb 735 2005/09/06
41824     Re:c문법 질문입니다. evergreen 861 2005/09/07
41827         Re:Re:c문법 질문입니다. 신성기 799 2005/09/07
41836             이곳이 국문학 공부하는 곳 도 아니고... 대충 넘어 갑시다. (냉무) evergreen 733 2005/09/07
41819     Re:c문법 질문입니다. 신성기 776 2005/09/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.