2012-07-15 4 views
2

간단한 VM을 작성 중이며 개체 및 구조 멤버 액세스를 구현하는 데 질문이 있습니다.개체 및 구조체 멤버 액세스 및 주소 오프셋 계산

프로그램의 시작 주소는 각 실행마다 임의적이므로 이후에 각 개체의 주소도 임의로 지정됩니다.

따라서 개체 나 개체 개체에 액세스하는 유일한 방법은 "기본"포인터에서 오프셋에 액세스하는 것입니다. 즉, 프로그램 구조에서 아무 것도 액세스하지 않아도되는 산술 연산이 필요합니다.

제 질문은이 방법이 전문 컴파일러에서 수행되었는지 여부입니다. 분명히이 접근법은 런타임에 약간의 오버 헤드를 추가하기 때문에 런타임에서이 프로세스를 오프로드하는 방법을 생각할 수 없습니다. 메모리 할당과 그 주소의 일관성에 대한 보장 부족?

답변

2

수십 년 동안 대부분의 컴퓨터는 주소를 기본 및 오프셋의 조합으로 지정할 수있는 주소 지정 모드를 제공하며 실제 계산은 CPU 클록주기의 추가 비용없이 하드웨어에서 수행됩니다.

최근 (수십 ​​년이 지난) 컴퓨터는 메모리 레이아웃 가상화를위한 하드웨어를 제공합니다. 즉, 항목의 실제 주소를 통해 모든 실행마다 다르기 때문에 가상 주소 공간의 주소는 동일하게 유지됩니다. 다시 말하지만, 계산이 프로그램의 실행 바이너리 코드에 대해 암시 적으로 보이지 않게 수행되기 때문에 기본 주소 사용에 대한 추가 비용은 없습니다.

+0

감사합니다. 이 메커니즘 플랫폼 특정 또는 아마도 표준화 된 휴대용 솔루션이 있습니까? 이 기능을 활용하는 방법에 대한 정보 링크를 제공 할 수 있습니까? 아니면 C/C++ 구현입니까? – dtech

+0

@ddriver 주소 지정 모드는 CPU에 따라 다릅니다. C/C++ 프로그래머는 C/C++ 프로그래머가 직접 사용할 수 없습니다. 컴파일러는 코드를 어셈블리로 변환하는 동안 코드를 활용합니다 (배열 인덱싱은 적어도 PDP-11 일 이후 기본 + 오프셋으로 수행되었습니다). 예를 들어,'int * p = getPointer(); int x = * (p + 5)'를 사용하면 대부분의 컴파일러는 int의 크기로 5를 곱하거나 곱하기를 포함하지 않는 매우 효율적인 액세스를 생성합니다. "기본 + 오프셋"주소 지정을 수행하려면 단일 CPU 명령이 실행됩니다. – dasblinkenlight