원칙적으로:
1. C++의 클래스 유형은 값 유형입니다. 즉, 클래스 객체가 인스턴스화될 때 스택에 메모리가 할당됩니다.
이런 식으로 클래스 유형을 다음과 같이 정의하면
클래스 A
{
공공의:
나는 int;
ㅋ;
}
A의 객체를 인스턴스화할 때 A는 멤버 유형을 기반으로 해당 객체가 차지하는 메모리 공간을 계산해야 하기 때문에 무한 루프에 빠지게 됩니다(데이터 멤버는 유형 및 멤버의 코드에 따라 결정됩니다). 함수는 exe에 저장됩니다. 메모리에 매핑하려면 포인터를 사용하여 메모리 주소를 가리키고 일부 클래스 설명 정보를 추가하면 됩니다. 그러나 sizeof는 개체를 만날 때 이 부분의 메모리 사용량을 표시하지 않습니다. a는 자체 유형이므로 a에서 사용하는 데이터를 계산합니다. 메모리 공간이고 a는 A 유형이므로 반복합니다.
그래서 C++에서는
자체 유형의 포인터를 포함할 수 있습니다(종종 연결 목록에서 사용됨).
클래스 A
{
공공의:
나는 int;
아*파;
}
포인터 변수가 차지하는 메모리 공간은 쉽게 결정할 수 있습니다. 기계어의 길이는 포인터 변수가 차지하는 공간의 양을 나타냅니다.
2. C#의 클래스 유형은 기본적으로 포인터인 참조 유형입니다.
따라서 C# 자체의 모든 클래스 개체는 4바이트(32비트 시스템)이며 힙 메모리 공간을 가리키는 메모리 주소를 포함합니다.
클래스 A
{
공개 int 나;
공개 Aa;
}
객체 = new A();
객체 자체는 4바이트의 메모리를 차지하며 이 메모리의 크기는 8바이트입니다(int 4바이트, a도 4바이트임). 멤버 a가 인스턴스화되면 a의 내용은 null이 아닙니다. 8바이트 메모리 공간을 가리키는 또 다른 주소를 힙 메모리에 저장합니다.
A의 객체가 얼마나 많은 메모리 공간을 차지하는지 확인할 수 있기 때문에(32비트 시스템에서 4바이트, 모든 C# 클래스 객체는 4바이트를 차지함) 다음을 정의할 수 있습니다.
-