반응형

C/C++ 에서 소켓통신을 하기 위해 패킷을 구조체로 정의한다.

일반적으로 아래와 같이 선언하여 사용한다.

struct _Socket
{
    int Size;
    char text[50];
} Socket;

해당 구조체로 패킷을 정의하면 패킷의 크기는 어떻게 될까?

int 자료형은 4바이트, char 자료형은 1바이트지만 배열로 선언하여 50 바이트가 된다.

두 값을 더하면 54가 나와야 하지만 sizeof(Socket); 결과는 56바이트가 된다.

왜 이런 결과가 나오는 것일까?

먼저 정답은 패딩비트에 의해 56바이트가 나오게 된다.

대부분의 컴파일러는 CPU가 접근하기 쉬운 위치에 필드를 배치한다. 그러다보니 중간에 빈 공간이 들어가는데 위 예시에서는 2바이트가 추가로 들어가게 된 것이다.

이렇게 추가된 2바이트를 패딩 비트라고 한다.

32bit CPU는 메모리에서 값을 읽어올 때 한번에 4byte(32bit)를 읽어 오고 64bit CPU는 한번에 8byte(64bit)를 읽어온다

 

그러면 이러한 상황을 방지하기 위한 방법이 뭐가 있는지 찾아보니 아래와 같이 구조체를 선언하면 패딩비트가 생성되지 않는다.

#pragma pack(1)
struct _Socket
{
  int Size;
  char text[50];
} Socket;
#pragma pack(pop)

위와 같이 선언한 구조체의 크기를 출력해보면 sizeof(Socket)의 결과가 54가 나오게 된다.

#pragma pack(1)이 뜻하는 바는 구조체에서 가장 큰 바이트로 변수의 크기가 설정되는데 해당 설정을 1바이트로 변경한다는 뜻이다. #pragma pack(pop)을 통해 원래 정렬된 값(4바이트)으로 돌아가게 된다.

#pragma pack(1)과 #pragma pack(pop) 사이에 선언된 모든 구조체에 해당 설정이 적용 된다.

 

#참고 사이트 : https://pangate.com/19

반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

[C++] 숫자만 입력받기 예제  (0) 2017.04.24
[C++] STL(Standard Template Library)  (0) 2017.04.17
반응형

//숫자외 입력을 받으면 새로 입력을 받게한다. 숫자 입력받을 시 프로그램 종료.


#include "iostream"

using namespace std;


void main()

{

int num=0;

cout << "숫자를 입력하세요;" << endl;

while (!(cin >> num)) {

cin.clear();

cin.ignore(INT_MAX,'\n');

cout << "잘못된 값을 입력하셨습니다. 숫자만 입력해주세요.\n";

}

}


실행환경 : Visual studio 2017 C++ / Windows 10


반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

패킷과 구조체 그리고 패딩비트  (0) 2019.05.09
[C++] STL(Standard Template Library)  (0) 2017.04.17
반응형

C++에는 표준 템플릿 라이브러리라는 STL이 있다.


STL 구성


Sequence containers: 연속된 자료형


Container adaptors: 자료구조


Associative containers: key:value 형식의 자료형


Unordered associative containers: 순서 없는 컨테이너(자바 hash랑 비슷?)


* 참조 사이트 : http://www.cplusplus.com/reference/stl/

반응형

'프로그래밍 > C/C++' 카테고리의 다른 글

패킷과 구조체 그리고 패딩비트  (0) 2019.05.09
[C++] 숫자만 입력받기 예제  (0) 2017.04.24

+ Recent posts