개발 Study

#22. 메모리함수 및 레퍼런스

HYuk 2021. 4. 27. 20:55
728x90

#memset

memset은 메모리를 초기화 시키는 함수이다.

-> 이는 배열같은 함수를 초기화시 for문을 사용하지 않고 초기화 할 수 있다는 장점이 있지만,

* 1byte(8bits) 단위로 초기화 되기 때문에 0이 아닌 다른 수(예를들어 1)로 초기화 시에 이상한 값이 나올 수 있다.

함수 사용 시,

memset(메모리 시작주소, 초기화 할 값, 초기화할 크기)

로 사용 한다.

#include <iostream>

using namespace std;

void main()
{
	int iArr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memset(iArr, 0, sizeof(iArr)); // iArr값을 모두 0으로 초기화

	for (int i = 0; i < 10; ++i) // 출력
	{
		cout << iArr[i] << endl;
	}
}

 

Tip.

= -> C기반의 초기화

ex) int iA=10;

() -> C++기반의 초기화

ex) int iA(10);

#include <iostream>

using namespace std;

void main()
{
	int*	ptr = new int(5);
	cout << "*ptr: " << *ptr << endl;
	delete ptr;
}

출력값은 5가 나온다.


#memmove 와 memcpy

memmove와 memcpy는 동일한 기능을 수행 하는 함수이다.

이름에서 알 수 있듯이, 한 메모리의 데이터를 다른 메모리에 복사해 넣는 함수이다.

사용법은 동일하다

memmove(복사받을 주소, 복사할 주소, 크기)

memcpy(복사받을 주소, 복사할 주소, 크기)

#include <iostream>

using namespace std;

void main()
{
	int		iA[5] = {};
	int		iB[5] = { 1, 2, 3, 4, 5 };

	memmove(iA, iB, sizeof(iB)); // iB를 iA에 복사

	for (int i = 0; i < 5; ++i)
		cout << iA[i] << endl;
}

두 함수의 차이점은

1. 

memmove는 표준,

memcpy는 표준이 아니다.

 

2. 

memmove는 버퍼가 있어서 중간 버퍼에 복사 후 목적지에 재복사를 하는 반면,

memcpy는 버퍼를 이용하지 않고, 메모리에 직접복사 한다.

 


#레퍼런스

레퍼런스는 C++부터 나온 자료형이다.

이는 한 변수를 별명을 만들어 똑같이 사용한다고 생각하면된다.

주소값을 공유하여 같이 사용 하기 때문에, 포인터와 유사한면이 있다.

레퍼런스는

자료형& 변수명 으로 선언한다.

다만 레퍼런스는 한번참조한 메모리는 변경이 불가능 하기 때문에 선언과 동시에 초기화를 해주어야 한다.

#include <iostream>

using namespace std;

void main()
{
	int iA = 10;
	int& r = iA;
	cout << "&iA: " << &iA << endl;
	cout << "&r: " << &r << endl;
	cout << "iA: " << iA << endl;
	cout << "r: " << r << endl;
}

또한 const 변수를 참조하기 위해서는

레퍼런스 또한 const로 선언해주어야 참조 할 수 있다.

ex)

const int iA=10;

const int r=iA;

 

다만 int iA=10; const in r=iA; 일때에는 선언이 되며, iA를 통한 값변경이 가능하다. (r를 통한 값변경은 불가능)

 

레퍼런스는 포인터 대신 다음과 같이 사용이 가능하다.

#include <iostream>

using namespace std;

void Swap(int& _iA, int& _iB);

void main()
{
	int iA = 1, iB = 2;
	Swap(iA, iB);
	cout << "iA: " << iA << endl;
	cout << "iB: " << iB << endl;
}

void Swap(int& _iA, int& _iB)
{
	int iTemp = _iA;
	_iA = _iB;
	_iB = iTemp;
}

이는 레퍼런스를 통해 직접 값에 접근하므로, 포인터에 비해 메모리값의 사용량을 줄일 수 있다.

 

예를들어 Add함수를 만들 때 레퍼런스 값을 통해 만들면,

Add(10,20) 과 같이 상수를 사용하면 에러가 발생하는데

이를 방지 하기 위해 함수를 만들때

int Add(const int& _iA, const int& _iB)

{

return _iA+_iB;

}

위와 같이 const를 붙여주면

Add(a,b) 와 같이 변수

Add(10,20) 와 같이 상수

모두 작동이 잘 된다.

#include <iostream>

using namespace std;

int Add(const int& _a, const int& _b);
void main()
{
	int	iA = 10, iB = 20;
	cout << Add(iA, iB) << endl;
	cout << Add(10, 20) << endl;
}

int Add(const int& _iA, const int& _iB)
{
	return _iA + _iB;
}

728x90