C ++에서 빈 클래스의 크기가 0이 아닌 이유는 무엇입니까?
중복 가능성 :
C ++ : 빈 클래스의 개체 크기는 얼마입니까?
다음과 같은 결과가 나오는 이유는 무엇 1
입니까?
#include <iostream>
class Test
{
};
int main()
{
std::cout << sizeof(Test);
return 0;
}
표준은 크기가 0 인 객체 (및 그 클래스)를 허용하지 않습니다. 두 개의 개별 객체가 동일한 메모리 주소를 가질 수 있기 때문입니다. 그렇기 때문에 빈 클래스도 (최소한) 1의 크기를 가져야합니다.
서로 다른 두 개체의 주소가 다른지 확인합니다. 같은 이유로 "new"는 항상 개별 개체에 대한 포인터를 반환합니다.
완전한 답변 은 Stroustrup 을 참조하십시오 .
C ++ 표준은 모든 클래스의 크기가 하나 이상임을 보장합니다. C ++ 표준에 따르면 어떤 객체도 다른 객체와 동일한 메모리 주소를 가질 수 없습니다. 이에 대한 몇 가지 좋은 이유가 있습니다.
보장이
new
항상 별개의 메모리 주소에 대한 포인터를 반환합니다.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 바이트입니다. 이것이 빈 클래스의 객체 크기가 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
'developer tip' 카테고리의 다른 글
Scala 2.8 컬렉션 디자인 튜토리얼 (0) | 2020.10.23 |
---|---|
Python 모듈의 절대적 vs. 명시 적 상대적 가져 오기 (0) | 2020.10.23 |
--start-group 및 --end-group 명령 줄 옵션은 무엇입니까? (0) | 2020.10.22 |
주어진 중심점, 반지름 및 각도로 원에서 점 찾기 (0) | 2020.10.22 |
setTimeout에서 약속을 만드는 방법 (0) | 2020.10.22 |