developer tip

참조 주소를 찾을 수있는 방법이 있습니까?

copycodes 2020. 12. 3. 08:03
반응형

참조 주소를 찾을 수있는 방법이 있습니까?


참조 주소를 찾을 수있는 방법이 있습니까?

좀 더 구체적으로 만들기 : 변수가 초기화되는 변수의 주소가 아니라 변수 자체의 주소.


참조에는 자체 주소가 없습니다. 참조는 포인터로 구현 될 수 있지만 이에 대한 필요 나 보장은 없습니다.

C ++ FAQ에서 가장 잘 설명합니다.

포인터와 달리 참조가 개체에 바인딩되면 다른 개체에 "재 장착"할 수 없습니다. 참조 자체는 객체가 아닙니다 (아이덴티티가 없습니다. 참조 주소를 사용하면 참조 대상의 주소를 알 수 있습니다. 참조는 참조 대상임을 기억하십시오).

참조가 포인터와 어떻게 다른지에 대한 포괄적 인 목록은 여기 내 대답을 참조하십시오 .

참조는 참조 대상입니다.


아니 . 참조 주소를 얻을 수있는 방법이 없습니다.
참조는 객체가 아니고 별칭이기 때문입니다 (즉, 객체의 다른 이름입니다).

int  x = 5;
int& y = x;

std::cout << &x << " : " << &y << "\n";

이것은 동일한 주소를 인쇄합니다.
이는 'y'가 개체 'x'의 또 다른 이름 (별칭)이기 때문입니다.


ISO 표준은 다음과 같이 가장 잘 말합니다.

참조에 대한 참조, 참조 배열 및 참조에 대한 포인터가 없어야합니다.

많은 사람들이 여기서 사용하는 논리가 마음에 들지 않습니다. 참조가 "어딘가에있는 포인터 일 뿐이라는 것을 보장하지 않기"때문입니다. 마찬가지로 int x아무 주소 만 프로세서 레지스터가 될 수 있지만, 마술 때 메모리 위치가된다 & x컴파일러는 당신이 원하는 것을 할 수 있도록 사용됩니다, 그것은 여전히 가능하다.

과거에는 많은 컴파일러가 사용자가 원하는 것을 정확히 허용했습니다.

int x, y;
int &r = x;
&r = &y; // use address as an lvalue; assign a new referent

방금 확인하고 GCC에서 컴파일하지만 강력한 경고와 함께 결과 프로그램이 손상되었습니다.


아니.

Bjarne Stroustrup이 TC ++ PL에서 말했듯이 참조는 기존 엔티티 (객체 또는 함수)의 다른 이름으로 생각할 수 있습니다. 이것이 참조를 구현하는 기본 저수준 메커니즘에 대한 가장 정확한 설명은 아니지만 참조가 언어 수준에서 구현하려는 개념에 대한 매우 좋은 설명입니다. 당연히이 언어는 참조 주소 자체를 얻을 수있는 수단을 제공하지 않습니다.

언어 수준에서 참조는 저장 공간을 차지한다고 보장되지 않으므로 일반적으로 주소가 없습니다.


이 같은 질문의 다른 예에서 : $ 8.3.2 / 3- "참조에 저장 (3.7)이 필요한지 여부는 지정되지 않았습니다.".

따라서 C ++ 표준은 컴파일러 / 런타임 구현자가 참조가 별도의 메모리 위치에 있는지 여부를 선택할 수 있도록합니다. 그러나 별도의 메모리 위치에있는 경우 표준을 준수하는 방식으로 주소를 찾을 수 없습니다. 그러니하지 마세요.

C ++ 표준의 정의에 따라 참조의 주소를 가져 오면 실제로 참조가 런타임 환경에서 별도의 엔티티로 존재하는 경우 참조의 주소가 아니라 참조하는 주소를 얻게됩니다. 또는 아닙니다.


'&'연산자를 사용하십시오. 예 :

int x = 3;
int &y = x;
cout<<&y<<endl;

y는 x의 주소에 지나지 않으므로 x의 주소를 반환합니다.


참조가 주소 지정 가능한 메모리에서 고유 한 위치를 가질 필요가 없기 때문에 안정적이지 않습니다.


그 자체로는 아닙니다. "주소"를 원한다면 구조체 나 클래스에 밀어 넣으십시오. 그렇다고해서 포인터를 사용하는 것 같은 작업을 수행 할 수 있다는 보장은 없습니다. 증명을 원하는 경우 참조의 크기는 참조 유형과 동일합니다. char &와 함께 시도하고보십시오.


가능하지만 엄격하게 C ++를 사용하지는 않습니다. 참조는 함수의 매개 변수로 전달되기 때문에 그 값은 스택이나 레지스터에 저장됩니다. 이것은 하드웨어 아키텍처에 따라 다릅니다. 이러한 값에 액세스하려면 인라인 어셈블리가 필요합니다. 스택 동작을 확인하고 주소를 등록하려면 사용중인 프로세서의 참조 설명서를 참조하십시오. 스택 또는 레지스터가 손상되면 BSOD, 데이터 손실 또는 시스템에 영구적 인 손상을 입힐 수 있습니다. 극도로주의해서 진행하십시오.


//YES reference varies
//but a little trick in the compiler

    int i = 333;
    int j = 444;
    int &ref = i;                   //ref=i value
    int* p = nullptr;


    printf("ref=%d\n", ref);        //333  i value

    *(&p + 3) = &j;                 //&ref=j

    printf("ref=%d\n", ref);        //444  j value

참고 URL : https://stackoverflow.com/questions/1950779/is-there-any-way-to-find-the-address-of-a-reference

반응형