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 기계에 호환되는 코드를 실행시키게 됩니다.
'프로그램잉_기타 > 안드로이드 스튜디오' 카테고리의 다른 글
구글 블러그에 app-ads.txt 개시 방법 (0) | 2021.05.03 |
---|---|
Cannot fit requested classes in a single dex file (# methods: 70512 > 65536) 에러 발생시 (0) | 2021.04.26 |
안드로이드 스튜디오 에뮬 파일 경로 확인 및 업로드 하기 (0) | 2021.04.04 |
안드로이드 스튜디오 단축키 (0) | 2021.02.27 |
안드로이드 스튜디오 caused by: java.lang.assertionerror: could not delete caches 에러 (0) | 2020.12.08 |