2017-01-12 3 views
1

내가 힘든 시간 (내가 그것에 대해 복수 응답을 읽고) 활성화 기록을 이해 있습니다. 우리는 프로그램을 실행하기 시작 코드활성화 기록

int n(int a){ 
     int b = a/2; 
     return a + b; 
    } 

int main(){ 
    int first = 1; 
    int second = n(first); 
    int third = 3; 
    int fourth = n(third); 
    return 0; 
} 

있다고 가정

는 스택 활성화 레코드 정적 로컬 변수, 함수 어드레스 기능을 넣어 같은

| first | 
    __________ 


    | activation_record | 
    | first   | 
    ____________________ 



    | third    | 
    | activation_record | 
    | first    | 
    _____________________ 



    | activation_record1 | 
    | third    | 
    | activation_record | 
    | first    | 
    _______________________ 

로 충전 될 매개 변수 및 그 스택에 반환 값, 내가 그것을 활성화 레코드 (또는 호출 수신자 함수) 실행 완료 후, 그 활성화 가치가 반환 값으로 대체됩니다 그 스택을 이해해야 하는가? 동일한 함수가 여러번 호출되는 한 곳 데이터를 반환 보유해야 갖는 호출 스택이 동일한 activation_record 것 또한 함께

스택에 푸시되거나마다 함수가 호출 생성? 다른 말로는 컴파일 타임에 활성화 레코드를 스택에 넣을 수 있습니까? 다른 솔루션이 가능하기 때문에

덕분에 대답

+0

그 ASCII 아트는 스택의 네 가지 스냅 샷을 할 건가요? –

+0

@MartinBonner 예 – Darlyn

답변

0

에 대해 서로 다른 답변을 얻을. C++ 표준은 관찰 가능한 동작 만 설명하고 스택 레이아웃은 관찰 할 수 없습니다. 경우에만 반환 값이 관찰하기 때문에

은 특히, 현대 컴파일러는 int main() { return 0; }에 프로그램을 줄일 수 있습니다.

return fourth;으로 작성했다면 현대 컴파일러가 fourth==4을 알아 냈을 것이며 프로그램을 return 4으로 바꿨을 것입니다.

그러나 이제 이러한 최적화가 발생하지 않는 순간을 위해 가정 및 일반 64 컴파일러를 보자. 다시 말하지만 결과는 달라집니다. 일반적인 x64 ABI는 함수 인수와 반환 값을 스택이 아닌 CPU 레지스터에 전달합니다. 이것은 x64 레지스터를 모두 사용하지 않으므로 로컬 변수는 일 수도 있고 레지스터에 들어갈 수 있습니다. 그들은 동시에 사용하지 않는로

서로 다른 정품 인증 기록도 중복됩니다. 컴파일러는 일반적으로 얼마나 많은 호출이 이루어질지를 결정할 수 없기 때문에 이것은 실제로 최적화가 아니지만 필요합니다. 예 : for (char&c : string) { c = toupper(c); }.