Microsoft MVP성태의 닷넷 이야기
클래스, 인터페이스 크기를 구하고 싶은데 어떻게 해야 될까요? [링크 복사], [링크+제목 복사],
조회: 7426
글쓴 사람
한예지 donator
홈페이지
첨부 파일
 

오늘 마지막 질문이 될 것 같아요!

namespace ConsoleApp36
{
    public interface IRepository
    {
        void Get();
    }

    public class Repository : IRepository
    {
        public void Get()
        {
            Console.WriteLine("Get() 메서드를 구현해야 합니다.");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IRepository repository = new Repository();
            unsafe
            {
                TypedReference tr = __makeref(repository);
                IntPtr ptr = **(IntPtr**)(&tr);
                Console.WriteLine(ptr);
            }
            repository.Get();
        }
    }
}
[출력]
51913544
Get() 메서드를 구현해야 합니다.

[질문 1]
알려주신 코드를 추가해서 ptr에 있는 값을 출력해보니 51913544가 나오는데
이것이 힙에 할당된 new new Repository() 시작주소가 되겠죠?

[질문 2]
만약 컴퓨터가 32비트 운영체제면 포인터 크기는 자료형에 상관없이 4바이트니까
주소를 담고 있는 repository의 자료형에 해당하는 IRepository의 크기도 4바이트로 생각해도 되나요?

[질문 3]
제가 sizeof로는 클래스, 인터페이스 등의 크기를 출력할 수 없더라구요....
Console.WriteLine(sizeof(IRepository)); ← 오류 발생
만약 클래스, 인터페이스의 크기를 출력하고 싶다면
위의 예시에서는 IRepository의 크기를 출력하고 싶다면 어떻게 해야 될까요?

추신) 커피 기능 추가하시면 꼭 알려주세요!
즐거운 금요일 밤 되세요~!!








[최초 등록일: ]
[최종 수정일: 11/27/2020]


비밀번호

댓글 작성자
 



2020-11-27 09시39분
답변1) 맞습니다.

답변2) IRepository의 크기라기보다는 대상 개체가 있는 힙의 주소를 가리키기 위해 스택에 잡혀 있는 변수의 크기가 4바이트입니다. 인터페이스 자체는 아무런 필드도 가질 수 없으므로 크기가 (이론상으로는) 0입니다.

답변3) sizeof는 컴파일 시점에 크기를 알 수 있는 타입에 한해 사용할 수 있습니다. 일반적인 닷넷의 managed 타입은 인스턴스화하기 전까지는 얼마나 개체의 크기가 잡힐지 알 수 없습니다. 이에 대해서는 이야기가 복잡해지는데 다음의 글을 읽어보시면 도움이 될 것입니다.

눈으로 확인하는 LayoutKind 옵션 효과
; https://www.sysnet.pe.kr/2/0/1558

그래서 일단, 대상 타입을 StructLayout으로 Sequential이나 Explcit로 명시해야 Marshal.SizeOf로 해당 개체의 크기를 알아낼 수 있습니다.

다음의 Q&A도 함께 읽어보는 것도 좋겠고,

Size of A Class (object) in .NET
; https://stackoverflow.com/questions/3694423/size-of-a-class-object-in-net

글의 덧글에 나온 dotnetex라는 별도의 라이브러리에서 크기를 구해주는 것도 참고하세요.

sidristij/dotnetex
; https://github.com/sidristij/dotnetex
정성태

... 16  17  18  19  20  21  22  23  24  25  26  27  28  29  [30]  ...
NoWriterDateCnt.TitleFile(s)
5130노인코래방2/25/201910834C#에서 가장 좋은 성능을 보이는 파일 읽고 쓰는 방법이 무엇인가요? [2]
5129진우2/23/201910285닷넷 32비트 기반에서 메모리 부족으로 프로그램이 죽는경우 문의 [2]
5128게스트2/23/20197962안녕하세요. 초보개발자입니다. [3]파일 다운로드1
5127c#2/20/20197007책에 예제 문의드립니다. [2]
5125게스트2/19/20197089delegate를 활용한 event 를 적절히 불러오고 싶습니다. [2]
5124정근화2/12/20196983윈도우 서버2003 환경 오류 [2]
5123김주현2/8/20197025MS LUIS 에 대한 소개 하실 계획이 있으신가요? [1]
5122jaka...2/1/20198872Clickonce 배포 후 Command 실행 [2]파일 다운로드1
5121엔벌이1/31/20198334C# DataGridView의 MDB파일 함수? ArrayList? [1]파일 다운로드1
5120임우진1/30/20198848웹에서 응용프로그램 바로 실행하기 관련 브라우저에서 파라미터가 넘어오지 않습니다.ㅜㅜ [2]
5119guest1/29/201910233교재에 오탈자 있어 알려드리려 합니다 [1]
5118WPF꿈...1/26/20198187GetHashCode 메서드에 대해서 [1]
5117하주형1/25/20198802List<int>에 대한 이해가 잘안됩니다. [5]
5116게스트1/24/20197573asp.net 관련 gridview webform 질문 드립니다. [1]파일 다운로드1
5115Soul...1/24/20197750투명 패널 질문드립니다. [2]
5114박현일1/20/20198077WPF DataContext 관련 초보 질문을 드려봅니다.^^ [5]
5113하주형1/20/20197324안녕하세요 시작하세요 C# 인코딩관련 질문드립니다. [1]
5112손성배1/19/201916288안녕하세요 cp949 인스톨시 오류입니다... 너무 힘들어요 [5]
5111게스트1/10/20197974암호화 라이센스 관련 문의 드립니다. [1]
5110WPF꿈...1/9/20197630Thread Abort 함수 사용시 [2]
5109닷넷개발1/9/20197592thread 관련 질문 예제.. [2]파일 다운로드1
5108닷넷개발1/9/20198745thread 관련 질문 드립니다.. [4]
5107우코아1/4/201911327WPF에서 로딩중 이미지를 구현 - Project [5]파일 다운로드1
5106우코아1/3/20198962WPF에서 로딩중 이미지를 구현 - Source [1]
5104우코아1/1/201910226WPF에서 로딩중 이미지를 구현 [4]
5103이혜성12/31/20181083332bit .net 으로 만들어진 dll파일 [5]
... 16  17  18  19  20  21  22  23  24  25  26  27  28  29  [30]  ...