해결된 질문
작성
·
466
0
RecvBuff _recvBuff = new RecvBuff(1024);
// 코드들 중략
void RegisterRecv()
{
_recvBuff.Clean();
// 질문1. 여기서 segment에 들어오는 값은 WriteSegment가 새로 할당한 값복사가 맞나요 ?
//( 호출 당시 멤버변수 _recvBuff 값은 가지고 있지만 원본과 상관없는 )
// 그렇게 생각한 이유 : ArraySement가 구조체이고 new를 했기때문에
ArraySegment<byte> segment = _recvBuff.WriteSegment;
// 질문2. MSDN을 읽어보니 SetBuffer 특정 메모리를 참조한다고 쓰여져 있는데요.. 그
// 그러면 여기서 참조하는 메모리가 이 안에 지역변수로 선언된 segment를 의미하나요 ? 즉 지역변수 메모리 주소를 가르키나요 ?
// 생각한이유, MSDN SetBuffer설명 : 비동기 소켓 메서드를 사용하여 버퍼로 사용할 메모리 영역을 설정합니다.
_recvArgs.SetBuffer(segment.Array, segment.Offset, segment.Count);
bool pending = _socket.ReceiveAsync(_recvArgs);
if (pending == false)
OnRecvCompletetd(null, _recvArgs);
}
// 세션 코드 끝, RecvBuff 코드
// 코드 중략
public ArraySegment<byte> WriteSegment
{
get { return new ArraySegment<byte>(_buffer.Array, _buffer.Offset + _writePos, FreeSize); }
}
답변 1
1
// 질문1. 여기서 segment에 들어오는 값은 WriteSegment가 새로 할당한 값복사가 맞나요 ?
ArraySegment는 단순히 특정 영역을 '가리키는' 혹은 '찝어주는' 역할을 합니다.
절대 무엇인가 복사를 하는 개념이 아닙니다.
C++이라면 포인터가 있으니 원하는 메모리 영역을 가리킬 수 있지만,
C#에서는 정상적인 방법으론 포인터 사용이 되지 않으므로,
메모리 영역을 ArraySegment의 3대 요소
(배열 시작위치 array, 데이터 시작 오프셋 offset, 데이터 크기 count)로 잡아주는거죠.
만약 포인터를 사용할 수 있었으면 array+offset 을 합쳐서 포인터로 표현할 수 있었을겁니다.
// 질문2. MSDN을 읽어보니 SetBuffer 특정 메모리를 참조한다고 쓰여져 있는데요.. 그
여러가지 버전이 있지만, 우리가 넘겨준 버전에서는
역시나 3대 요소를 넘겨줬으니 해당 메모리 영역을 참조하겠죠.
아하 빠른 답변 감사합니다..왜인지 구조체가 new하면 값복사가 이루어진다고 생각하고 있어서 헷갈렸네요 검색해보니 비슷한 질문이 있었네요