developer tip

C ++에서 빈 클래스의 크기가 0이 아닌 이유는 무엇입니까?

optionbox 2020. 10. 23. 07:47
반응형

C ++에서 빈 클래스의 크기가 0이 아닌 이유는 무엇입니까?


중복 가능성 :
C ++ : 빈 클래스의 개체 크기는 얼마입니까?

다음과 같은 결과가 나오는 이유는 무엇 1입니까?

#include <iostream>

class Test
{
};

int main()
{
    std::cout << sizeof(Test);
    return 0;
}

표준은 크기가 0 인 객체 (및 그 클래스)를 허용하지 않습니다. 두 개의 개별 객체가 동일한 메모리 주소를 가질 수 있기 때문입니다. 그렇기 때문에 빈 클래스도 (최소한) 1의 크기를 가져야합니다.


서로 다른 두 개체의 주소가 다른지 확인합니다. 같은 이유로 "new"는 항상 개별 개체에 대한 포인터를 반환합니다.

완전한 답변 Stroustrup참조하십시오 .


C ++ 표준은 모든 클래스의 크기가 하나 이상임을 보장합니다. C ++ 표준에 따르면 어떤 객체도 다른 객체와 동일한 메모리 주소를 가질 수 없습니다. 이에 대한 몇 가지 좋은 이유가 있습니다.

  1. 보장이 new항상 별개의 메모리 주소에 대한 포인터를 반환합니다.

  2. 0으로 나누는 것을 피하기 위해. 예를 들어, 포인터 산술 (대부분 컴파일러에 의해 자동으로 수행됨)에는 sizeof(T).

그러나 이것이 빈 기본 클래스가 파생 클래스의 크기에 1을 추가한다는 것을 의미하지는 않습니다.

struct Empty { };

struct Optimized : public Empty {
    char c;
};

// sizeof(Optimized) == 1 with g++ 4.0.1

Bjarne Stroustrup도 이것에 대해 이야기합니다 .


데이터 멤버와 멤버 함수가없는 클래스 이러한 유형의 클래스를 빈 클래스라고합니다. 빈 클래스의 객체 크기는 항상 1 바이트입니다.

우리가 그 시간에 어떤 클래스의 객체를 만들 때 객체는 항상 3 개의 특성을 얻습니다

  1. 상태
  2. 행동
  3. 정체

이때 빈 클래스의 객체를 생성하면 그 객체의 상태는 아무것도 아닙니다. 해당 개체의 동작도 아무것도 아니지만 컴파일러는 해당 개체에 고유 주소를 할당합니다. 컴퓨터의 메모리는 항상 바이트 형태로 구성되며 개체 주소 위치에서 사용 가능한 최소 메모리는 1 바이트입니다. 이것이 빈 클래스의 객체 크기가 1 바이트 인 이유입니다.


Maurits와 Péter가 말한 것.

이 컨텍스트에서 컴파일러가 EBCO (빈 기본 클래스 최적화)를 수행 할 수 있다는 점은 흥미 롭습니다.

#include <iostream>
struct Foo {};
struct Bar : Foo {};
int main () {
    std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;        
}

컴파일하고 실행하면 아마도 "1,1"이 출력 될 것입니다. EBCO의 Vandevoorde / Josuttis 16.2 도 참조하십시오 .

참고 URL : https://stackoverflow.com/questions/2362097/why-is-the-size-of-an-empty-class-in-c-not-zero

반응형