인프런 커뮤니티 질문&답변

chobo님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

반복문 내에 있는 buff 변수의 생성 및 유지?에 관해서 질문있습니다.

작성

·

180

0

선생님 안녕하세요. 밑에 별표 되어 있는 부분에 buff가 지역변수이기 때문에

반복문이 매번 실행될 때마다 새로 만들어지는 것으로 알고 있었습니다.

하지만 매번 반복문이 실행될 때마다 새로 만들어진다면 ArraySegment가 buff에 있는 것을 가리키는데

이때 새로 만들어진다면 buff의 원본 데이터가 삭제되고 다시 만들어지기 때문에

기존에 ArraySegment가 가리키는 것은 없어진다고 생각됩니다.

그래서 혹시나 해서 예제 코드를 만들어서 직접 확인해보았습니다.

void RegisterSend()

{          

            while (_sendQueue.Count > 0)

            {

                byte[] buff = _sendQueue.Dequeue();     // ★★★          

                _pendingList.Add(new ArraySegment<byte>(buff, 0, buff.Length));

            }

           // 코드 생략

}

■■■■■■■ 예제 코드 ■■■■■■■

static void Main(string[] args)

{

            unsafe

            {

                int* pointer;

                int* pointer2;

                Queue<int> _sendQueue = new Queue<int>();

                for (int i = 0; i < 3; i++)

                {

                    _sendQueue.Enqueue(i);

                }

                for (int i = 0; i < 3; i++)

                {

                    int var = _sendQueue.Dequeue();

                    pointer = &var;

                    Console.WriteLine($"{var}, {(int)pointer}");

                }

           }

}

[출력]

0, 11923652

1, 11923652

2, 11923652

하지만 예상과는 다르게 예제 코드를 보시면 var의 메모리 주소가 11923652로 동일하게 나오는데

그러면 반복문이 실행될 때마다  int var 변수가 새로 생성되는 것이 아니라 계속 재사용하는 것인가요?

질문을 정리하면

[질문 1]  예제 코드에서 반복문이 실행될 때마다  int var 변수가 새로 생성되는 것이 아니라 계속  재사용하는 것인가요?

[질문 2]  만약 재사용이 아니고 새로 생성된다면 ArraySegment가 buff에 있는 것을 가리키는데

이때 반복횟수가 바뀔 때마다 buff가 새로 만들어진다면 기존에 있던 buff에  있는  원본 데이터가 삭제되는데

ArraySegment가 가리키고 있는 buff에 있는 데이터가 없어지는데 이것을 BufferList에 저장하는 것이 가능한가요?

매번 좋은 답변 감사드립니다!

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

선생님 안녕하세요. 밑에 별표 되어 있는 부분에 buff가 지역변수이기 때문에
반복문이 매번 실행될 때마다 새로 만들어지는 것으로 알고 있었습니다.

-> 네 맞습니다!

하지만 매번 반복문이 실행될 때마다 새로 만들어진다면 ArraySegment가 buff에 있는 것을 가리키는데
이때 새로 만들어진다면 buff의 원본 데이터가 삭제되고 다시 만들어지기 때문에
기존에 ArraySegment가 가리키는 것은 없어진다고 생각됩니다.

-> 그렇지 않습니다! 
C#의 byte[] buff는
C++을 기준으로 보면 (byte buff[1024]가 아니라) byte* buff입니다.
즉 배열 원본 데이터는 힙 영역에 존재하고,
buff라는 로컬 변수에서는 단지 해당 원본 데이터의 주소값을 들고 있는 상태입니다.
따라서 원본 데이터가 삭제되고 다시 만들어지는 것은 절대 아닙니다.

0

chobo님의 프로필 이미지
chobo
질문자

진짜 매번 답변 받을 때마다 헷갈리는 부분을 정확히 설명해주셔서 정말 감사드립니다!! 

chobo님의 프로필 이미지

작성한 질문수

질문하기