2009-10-01 2 views
1

왜 멤버 함수가있는 클래스의 크기가 1 바이트입니까? 멤버 함수는 다음 예제에서 4 바이트입니다.왜 멤버 함수가있는 클래스의 크기가 1 바이트입니까? 멤버 함수는 4 바이트입니다.

class Test 
{ 
    public: 
      Test11() 
      { 
       int m = 0; 
      }; 
}; 

int main() 
{ 
    Test t1; 
    int J = sizeof(t1); 
    int K = sizeof(t1.Test11()); 
    return 0; 
} 

여기에서 J는 1 바이트가되고 K는 4 바이트가된다. K = 4이면 클래스의 크기가 4 바이트가 아닌 이유는 1 바이트입니다.

+4

Test :: Test11의 실제 반환 형식은 무엇입니까? 그것은 오타이고 Test :: Test()를 의미합니까? 게시 한 코드는 반환 형식이없는 멤버 함수가있는 클래스를 정의한다는 점에서 잘 형성되어 있지 않습니다. –

답변

13

함수 자체는 실제로 클래스에 저장되지 않습니다.

클래스의 데이터 멤버 (및 가능한 경우 해당 vtable 포인터가있는 경우) 만 크기에 영향을줍니다. 함수 자체는 실행 가능 코드 영역에 있으며 동일한 유형의 클래스의 모든 인스턴스는 함수의 하나의 정의를 사용합니다. 컴파일러는 클래스의 새 인스턴스를 만들 때마다 실제로 함수 본문 전체를 복사하지 않습니다.

또한 sizeof(t1.Test11())은 "Test :: Test11 함수의 크기 (바이트)"를 의미하지 않습니다. "Test :: Test11에 의해 반환 된 타입의 크기"를 의미합니다.

+1

또한 1은 반환 할 최소 크기입니다. 그렇지 않으면 배열이 심하게 망가질 것입니다. – derobert

3

함수 구현은 클래스의 각 인스턴스에 포함되어 있지 않으므로 클래스의 인스턴스는 크기가 0이지만 가질 수는 없습니다. Bjarne Stroustrup이 여기에 쓴 why is the size of an empty class not zero?

관련 문제