작성
·
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
선생님 안녕하세요. 밑에 별표 되어 있는 부분에 buff가 지역변수이기 때문에
반복문이 매번 실행될 때마다 새로 만들어지는 것으로 알고 있었습니다.
-> 네 맞습니다!
하지만 매번 반복문이 실행될 때마다 새로 만들어진다면 ArraySegment가 buff에 있는 것을 가리키는데
이때 새로 만들어진다면 buff의 원본 데이터가 삭제되고 다시 만들어지기 때문에
기존에 ArraySegment가 가리키는 것은 없어진다고 생각됩니다.
-> 그렇지 않습니다!
C#의 byte[] buff는
C++을 기준으로 보면 (byte buff[1024]가 아니라) byte* buff입니다.
즉 배열 원본 데이터는 힙 영역에 존재하고,
buff라는 로컬 변수에서는 단지 해당 원본 데이터의 주소값을 들고 있는 상태입니다.
따라서 원본 데이터가 삭제되고 다시 만들어지는 것은 절대 아닙니다.
0