2010-12-01 5 views
1

참조가 함수의 매개 변수이고 해당 함수가 인라인 된 경우 참조가 참조 자체가 아니라 포인터 일 필요는 없지만 참조가 매개 변수가 아니라 함수 또는 글로벌 로컬, 또는 인라인 함수의 출력 : 기준이 소스 파일의 끝에 글로벌 NUM을 가리키고 글로벌 때이러한 경우에 참조 처분은 어떻게됩니까?

//global scope 

void someFunc(SomeType & ref){//when function is inline, it's possible for ref to be the referent itself 
//function body 
} 
int num=7; 
int & ref=num;//what about ref here? 
void someFunc1(){ 
int num=6; 
int & ref=num;//what about ref here? 
//rest of function body 
} 
int & someFunc2(){//what about output reference here when function is inlined, will it be num itself or a pointer ? 
int num=8; 
return num; 
} 

답변

1

David Rodríguez - dribeas는 이미 표준이 컴파일러에게 참조 할 때 위도 약간을 제공한다는 의견에서 지적했습니다. 그들은 공간을 차지할 수도 안할 수도 있습니다. 그들은 적절한 객체가 아닙니다.

참조 유형의 함수 인수에 대해 설명하는 동작 (인라인 중에 제거됨)은 컴파일러가 참조와 관련하여 갖는 자유에 대해 일반적입니다. 그러나 그것은 자유이며 의무는 아닙니다. 언제나 가능하지 않을 수도 있습니다 : SomeFunc(a>5 ? foo : bar);을 호출하면 컴파일러가 참조를 "the"지시어 자체로 바꿀 수 없습니다.

다른 예는 마찬가지로 제약이 없습니다. 글로벌 및 로컬 참조는 이론적으로 최적화 할 수 있습니다. 왜냐하면이를 막을 수있는 것이 아무것도 없기 때문입니다. 마지막 예제는 범위를 벗어난 객체에 대한 참조를 반환하기 때문에 exit(NasalDemons());으로 완전히 인라인 될 수 있습니다.

1

제 경우. ref가 someFunc1 인 두 번째 경우는 num3을 가리키고 someFunc1입니다. someFunc2의 끝에서 num이 소멸되므로 마지막 케이스에서와 같이해서는 안됩니다. 외부에서 사용할 경우 세그먼트 화 오류가 발생합니다. 다음

+0

문제는 정확히 "가리킨다"가 의미하는 것입니다. – Pooria

+0

ref를 변경하면 num이 변경됩니다. 심판 대신 num을 쓰는 것과 정확히 같습니다. – Marii

+0

아니요, 그 뜻이 아니 었습니다. 포인터 또는 지시 대상의 별칭 일 것입니다. – Pooria

1

지시 대상 자체가 아니라 그것이

의미 적, 참조가 항상 (이름) 개체 자체 및 결코 A는 에 반드시 포인터가 될 것입니다 참조 그것에 대한 포인터.

구현면에서 함수가 인라인되면 포인터가 사용되지 않는다고 보장 할 수 없습니다. 전역 변수 나 지역 변수에 대해서도 보장 할 수 없습니다. someFunc2()은 정의되지 않은 동작으로 매달린 참조를 만듭니다.

세 가지 유효한 경우 (인라인, 전역, 로컬) 모두에서 컴파일러는 포인터를 저장하기 위해 여분의 공간을 사용하지 않아도되지만 확실한 문장을 작성하려면 컴파일러를 선택하고 내부를 검사해야합니다 . 외부 링키지가있는 전역의 경우, 실행 가능 형식도이를 허용해야합니다.

관련 문제