기타/C++

[C++] 구조체

푸쿠이 2020. 6. 6. 16:55
기본 문법
#include <iostream>

struct S_DATA
{
	int nData;
	float fData;
};

int main()
{
	S_DATA sData{};
	sData.nData = 100;
	sData.fData = 50.5f;
    
	printf("%d\n", nData);
	printf("%f\n", fData);
}

구조체는 변수들을 그룹짓는 것이다.

sData.nData = 100;
sData.fData = 50.5f;

이렇게 직접 접근해서 값을 바꾸기 때문에, 구조체는 변수가 public 으로 선언된다.

구조체 메모리 사이즈 계산하기

가장 큰 자료형을 기준으로 메모리 공간을 잡는다.

 

int 4바이트, char 1바이트기 때문에 int를 기준으로 메모리를 잡는다.

struct S_TEST
{
	int n1;
	char c1;
	char c2;
	int n2;
};

4바이트 확보
-> 4바이트 모두 n1이 사용

4바이트 확보
-> 1바이트 c1이 사용
-> 1바이트 c2이 사용
-> 2바이트 padding (2바이트로는 int를 못 담으니까)

4바이트 확보
-> 4바이트 모두 n2가 사용

 

구조체 S_TEST의 크기는 12바이트이다.

 

Q. 공부하면서 갑자기 궁금했던 질문

구조체 안에 구조체가 있다고 해서 메모리 기준을 구조체의 크기로 잡지는 않는다.

그 안의 기본 자료형 중에서 가장 큰 것을 기준으로 삼는다.

int 배열이 있어도 기본 자료형인 int 를 기준으로 계산한다.

 

네트워크 프로그래밍 할 때는 프로젝트 설정에서 메모리 기준을 1바이트로 고정해서 사용한다고 한다.

빨라야하니까.

함수 인자에 구조체

이렇게 복사로 넘기면 안 되고, 

#include <iostream>

struct S_DATA
{
	int nData;
	float fData;
};

void printData(S_DATA sData);

int main()
{
	S_DATA sData{};

	sData.nData = 100;
	sData.fData = 50.5f;

	printData(sData);
}

void printData(S_DATA sData) // 복사 전달 하지마.
{
	printf("%d, %f\n", sData.nData, sData.fData);
}

포인터로 넘겨야 한다. 이유는 구조체 사이즈 때문이다. 너무 커서...

#include <iostream>

struct S_DATA
{
	int nData;
	float fData;
};

void printData(const S_DATA *pData);

int main()
{
	S_DATA sData{};

	sData.nData = 100;
	sData.fData = 50.5f;

	printData(&sData);
}

void printData(const S_DATA * pData) // 포인터 전달로 하자.
{
	printf("%d, %f\n", pData->nData, pData->fData);
}

구조체 포인터는 화살표 오퍼레이터를 사용할 수 있다.

void printData(const S_DATA * pData) // 포인터 전달로 하자.
{
	printf("%d, %f\n", pData->nData, pData->fData);
	printf("%d, %f\n", (*pData).nData, (*pData).fData);
}

화살표 오퍼레이터는 참조와 . 을 생략한다.

다중 포인터를 사용하게 될 경우에 유용하게 사용된다.