2012-05-04 2 views
8

32 비트 컴퓨터에서 double에 대한 참조 인 경우에도 항상 sizeof의 참조를 얻습니다. 따라서이 4 바이트에 실제로 저장되는 내용은 무엇입니까?참조 크기가 항상 4 바이트 인 이유 - C++

EDIT :

class A{ 
public: 
    double& a; 
}; 

int main(){ 
    cout << sizeof(A) << endl; // this will print out 4 
} 
+8

참조가 객체가 아니기 때문에 참조의 크기를 가져올 수 없습니다. 테스트 할 코드를 알려주십시오. –

+0

왜 부정 투표입니까? – AlexDan

+3

질문이 의미가 없으므로. @ R.MartinhoFernandes가 말했듯이, 당신은 참조의 크기를 얻을 수 없습니다. 그러므로 실제로 * 수행중인 작업을 보여주는 코드를 게시하지 않으면 질문에 대한 답변이나 답변 방법이 전혀 없습니다. – jalf

답변

30

표준은 sizeof (C++ 11 5.3.3/4)에 아주 분명하다 기준 또는 기준 입력에인가되면

결과는 참조 된 유형의 크기입니다. 당신이 정말로 sizeof(double&)을 복용하는 경우 sizeof(double) 4.

업데이트입니다

그래서 컴파일러는 당신을 말하고있다 : 그럼, 당신이 정말로 클래스 타입에 sizeof을 적용하고 있습니다. 이 경우

클래스에 적용될 때, 그 결과, 해당 클래스의 객체의 바이트 수는 [...]

그래서 우리가 알고 있다는 기준의 존재 inside A은 4 바이트를 차지합니다. 표준이 구현되는 방법을 표준에서 요구하지는 않지만 컴파일러는 여전히 어떻게 든 구현해야합니다. 이것은 어떻게 든 컨텍스트에 따라 매우 다를 수 있습니다. 그러나 클래스 유형의 참조 멤버 인 경우 의미가있는 유일한 접근 방법은 등 뒤에서 double*을 몰래 들고 얼굴에 double&이라고 부르는 것입니다.

아키텍처가 32 비트 (포인터가 4 바이트 길이) 인 경우 결과가 설명됩니다.

의 개념은 특정 구현과 관련이 없음을 명심하십시오. 표준을 사용하면 컴파일러가 원하는대로 참조를 구현할 수 있습니다.

19

수 없습니다. 그렇지 않습니다.

C++ 참조는 이 아니고 포인터입니다. 이것은 객체의 별명입니다. 간혹 일 때, 컴파일러는 포인터를 사용하여 이것을 구현하기로 선택합니다. 그러나 종종, 로 아무 것도하지 않고 구현합니다.. 단순히 원래 객체를 직접 참조하는 코드를 생성하면됩니다.

어떤 경우에도 참조 유형 에 적용된 sizeof은 참조 번호을 제공하지 않습니다. 그래서 당신이하는 일이 무엇인지를 설명하기가 불가능하게 만드는 것은 분명하지 않습니다.

당신은 참조를 포함하는 클래스의 크기를 복용 :

편집 지금 당신은 몇 가지 코드를 표시 한 것으로

, 우리는 질문에 대답 할 수 있습니다.앞서 말했듯이 참조는 포인터가 아니지만 필요한 경우 컴파일러가 포인터를 사용하여 포인터를 사용하여 포인터를 나타낼 수 있습니다. 참조가 포함 된 클래스를 만들 때 컴파일러에서 구현할 수있는 유일한 방법은 객체의 주소를 보유하는 클래스를 정의하는 것입니다. 32 비트 시스템에서 주소는 32 비트 또는 4 바이트입니다. 따라서 sizeof 같은 클래스는 (일반적으로) 4가됩니다.

+0

여러 수준에서 잘못되었습니다. "때때로 컴파일러는 포인터를 사용하여 이것을 구현하기로 선택하지만 종종 아무것도하지 않음으로써 구현합니다." 이것은 정수와 다른 점이 아닙니다. 'int i = 1;이 선언을하지 않는다는 것에 동의하지 않는다면 (최소한 i가 나중에 변경되지 않는다면) 참조가 전혀 없다고 말할 수 없습니다. – jpalecek

+14

물론 가능합니다. 다음과 같이하면 : int i = 0; int & r = i'이면 컴파일러는 일반적으로 스택에'i'에 대한 포인터를 넣기위한 코드를 생성하지 않습니다. 대신'r'에 대한 후속 작업 ('r ++')은'i ++'를 작성한 것과 똑같은 * 동일한 코드를 방출합니다. 참조는 단지 별칭 일뿐입니다. – jalf

+0

참조는 정확히 포인터입니다. 컴파일러가'int i; int & r = i','int i;와 같이 할 수 있습니다. int * r = & i'. 포인터로 할 수없는 모든 최적화는 참조로 할 수 없습니다. 포인터 앨리어싱의 문제는 참조와 함께 전체적으로 나타납니다. –

관련 문제