반응형

C++에서 포인터, 구조체와 관련한 -> 명령을 이해하기 위해선 

포인터의 기본, 구조체의 기본을 이해하고 있어야 합니다.

 

아래는 제가 안드로이드 스튜디오에서

처음으로 C++ 사용하게 되면서 격은  기초적인  부분입니다.

 

 

C++에서 구조체 예


예시

 

*pInfo 포인터 TsprInfo 구조체 형식으로 선언 했다


예시 코드 및 간단 설명

 

struct TsprInfo *api=pInfo;

*api 포인터를 정의한 구조체 포인터로 역시 선언하고 주소 위치를 pInfo의 포인터 주소를 받아 사용합니다.

 

api+=zsp;

api 포인터 주소를 zsp 변수 값만큼 증가시킵니다.

zsp가 1 이면 TsprInfo 구조체 크기만큼 2 면  TsprInfo 2배 크기 만큼  주소를 증가시킵니다.

 

int *ip=api->sprlocp;

int로 만든 ip 포인터의 값에(주소에)

 

구조체 포인터로 선언된 api의  포인터의 값 중에서

sprlocp 포인터 주소 값을 받아

ip 포인터에 대입한다는 뜻입니다.


참고로 델파이 형식으로 위와 같습니다.

 

C++를 접한 지 얼마 안돼 -> 이게 도대체 뭔가 하고 한참을 고민했습니다...


다른 예)

위와 같은 경우는

zy 값에  +

api 구조체 포인터m_sx 값을 더한 뒤  + (api->m_sx는 int 입니다)

다시 zsize 값을 더해서 

 

arr[7]에 입력한다는 뜻입니다.


 C++ struct(구조체)에서 패딩이라는 게 존재합니다.

 

폰마다 구조(32bit 64bit) 따라

안드로이드 스튜디오에서

같은 소스를 같은 컴파일러로

컴파일해도 구조체 크기가 다르게 설정되는 경우가 있습니다.

이게 패딩이라 것 때문인데 ~ 참고하세요

 

구조체를 명확하게 설계하지 않으면 컴파일 할때

구조체  크기가 다르게 증가해 오류가 발생합니다!

 

아래 예시에서 보듯이 구조체 변수들이

int로 배열되지 않으면  패딩이 발생합니다.

 

(이해를 위해 대충 적은 것입니다.)

struct teststruct{

  char x;

  패딩 3바이트~

  int dx;

 

  char dsf;

  short fd;

  패딩 1바이트~

 

  int.. ;

  int... ;

 

  char... ;

  shrot... ;

  패딩 1바이트~

 

  char... ;

  char... ;

  char... ;

  char... ;

 

  int...;

..

  int *pEvt

  포인터에서 패딩 4바이트~(64bit 폰에서 실행될 때)

..

 

..

}

이런 식으로 구조체를 마구잡이로 설정하다 보면

패딩 때문에 구조체 크기가 특정폰에서

다르게 설정되어 앱 오류가 발생하게 됩니다.

 

구조체는 int 등 크기에

맞추어 배열되도록 잘 설계해야 할 것 같습니다.

 

구조체 안에 포인터들어가 있을 경우 

64bit 스마트 폰에서 앱을 실행할 때

32bit 스마트 폰에서 앱을 실행할 때 보다

패딩 4 byte가  증가합니다.

스마트폰이 64bit 이므로 주소를 64bit(8byte)로 잡아서 인 듯!

 

패딩을 하는 원인은 CPU의 접근이 용이하도록 하기 위해서라고 합니다.

 

윈도 델파이에선 32bit 코딩에 아무 생각 없어 구조체를 사용하다가

안드로이드 스튜디오 JNI C++ 하면서

안드로이드 에뮬과 삼O폰 2대에서 잘 되던 앱이

특정폰에서는 오류가 나서

원인을 알아내는데 식겁했어요 ~

 

에물과 삼O폰 2대는 32bit였고

오류가 나는 폰은 64bit였기 때문이 이였습니다.

 

구조체 안의 포인터 할당 바이트 값이 증가한 것 때문이었습니다.

 

참고로 다음 부분이 관련 있으니 참고하세요

#pragma pack


※ 참고로 안드로이드 스튜디오에서 C++를 릴리즈로 컴파일 하면
x86과 arm  기계어로 32bit 와 64bit 두가지 형식으로 전부 컴파일됩니다.

 

안드로이드 기기에서 앱을 실행 시키면
32bit와 64bit 기계에 호환되는 코드를 실행시키게 됩니다.

반응형

+ Recent posts