암시적(implicit) 캐스팅

형 변환이 허용되지만 프로그래머가 명시적 형 변환 안 할 경우

ex)

int number1 = 3;

long number2 = number1; // 암시적 캐스팅

 

명시적(explicit) 캐스팅

프로그래머가 형 변환을 위해 코드를 작성

C++캐스팅

1.static_cast

2.const_cast

3.dynamic_cast (C++98, 모던C++에서 도입)

4.reinterpret_cast

 

C스타일 캐스팅과 C++스타일의 차이

C스타일은 C++ 스타일 4개 중 하나를 한다 = 명확하게 구분X

->명백한 실수를 컴파일러가 캐치 불가능

=C++캐스팅이 해결

C스타일은??

int number2 = (int)number1;

 

static_cast

(값)

값을 유지하려고한다. 3.xx일때 반올림 오차를 제외하고 기본적인 값을유지하려 노력

이진수 표기는 달라질 수 있다 float->int로 바꿀 시 값은 같지만 이진수 표기방식은 바뀜

(개체 포인터)

변수형 체크 후 베이스 클래스를 파생클래스로 변환

컴파일 시에만 형 체크 가능

실행 도중 크래시 가능성 있음

static_cast를 사용하면 정말 말도 안되는 상속으로 인한 형변환을 막을 수 있다.

reinterpret_cast

연관이 없는 두 포인터 형 사이의 형변환을 허용

포인터와 포인터 아닌 변수 사이의 형 변환 허용

이진수 표기 달라지지 않는다

=>위험 (사용하는 경우가 있나??

=포인터가 가리키는 주소값을 보기위해 int형으로 형변환...(예시)

static_cast의 경우는 상속처럼 관련있는 경우를 제외하곤 컴파일 에러를 내는데

reinterpret_cast의 경우는 형변환을 해주는 대신 -10을 형 변환할시 값이 -10을 유지하지 않음(바이너리 코드가 동일)

const_cast

const_cast로는 형변환이 불가능(const, volatile를 제거할때 사용)

-포인터 형에 사용할 때만 말이 된다

const_cast를 코드에서 쓰는것은 코딩을 잘못하고있다는것

(const를 이유가 있어서 사용했는데 강제로 제거하는 것은 잘못된 행위)

->그치만 사용하는 경우가 있다??

=외부 라이브러리가 잘못 짜여져서 맞지않는 경우..(그래도 추천하지는 않는 방식!!)

dynamic_cast

실행 중에 형을 판단(static_cast의 경우는 컴파일 시 형을 판단한다는 차이)

포인터, 참조형을 캐스팅 할 때만 사용

호환되지 않는 자식형으로 캐스팅->return NULL;

=static_cast보다 조금 더 안전한 방식이다.

사용하려면 RTTI(실시간 타입정보, Real-Time Type Information) 실시간으로 데이터 형 정보를 줌

RTTI사용 안할 시 dynamic_cast는 static_cast와 동일.... C++에서는 RTTI를 보통 끄고쓴다..

왜?? C++은 성능 중시 업계에서 사용하기때문에 RTTI는 성능 저하 - 필요한 것은 직접 RTTI 구현

 

캐스팅은 보통 가장 안전한 static_cast에서->reinterpret_cast->(변경권한 없는 외부 라이브러리 호출시)const_cast 사용

기본적인 static_cast는 컴파일러로 에러를 알기 쉽기에 사용하며,

reinterpret_cast는 포인터와 비포인터 사이의 변환(가끔 사용)을 제외하고는

연관없는 포인터의 변환이 정말 필요할 때만 사용(100% 확신할 경우에만 사용)

 

함수의 사용(함수는 메모리 안에 할당)

함수 호출을위해서는 변수를 스택에 푸쉬하고 함수 주소로 점프한 후 함수 실행 함수가 끝난 뒤 호출자 함수로 점프

처음에 스택에 푸쉬한 변수들을 팝

모든걸 함수로 만들라는 말은 맞지 않다->생각보다 함수의 방식때문에 느리고 cpu 캐시가 최적이 아니다..

함수를 쓰는 경우는 가독성을 위해서 또는 재사용성이 높은 코드만 사용

 

인라인 함수??

인라인 함수는 복사 붙여넣기다!!

매크로 기능과 매우 비슷한 개념(매크로는 전처리기 인라인은 컴파일러가 처리)

=>그러면 매크로를 사용하면 되지않나??

매크로는 디버깅이 힘듦(콜스택 함수이름 안보임, 브레이크 포인트 설정 불가능)

범위도 준수하지않고 굳이 매크로를 쓸 이유가 있지않는 경우 인라인 함수를 쓰는게 좋다!!

다만, inline 키워드는 힌트일 뿐이다.

컴파일러가 사용하지 않을수도있음.

인라인 함수는 헤더파일에 존재해야 된다! - b.h를 인클루드하는 a.cpp b.cpp를 컴파일 할때 확인이 되기위해!

각 cpp파일은 따로 컴파일되기때문

 

인라인함수는 간단함 함수에 적합하다

ex) getter, setter

 

일반 함수 사용 - 함수 주소에가서 읽는 방식

인라인 함수 사용 - 지정된 부분에 인라인 한 부분을 복사하는 방식

즉, 실행파일 크기 증가확률이 높다(여러번 복붙이라서) 남용하면 안된다.

실행파일의 크기는 작을수록 cpu캐시하고 잘 작동하기떄문 -> 속도증가

'C++' 카테고리의 다른 글

C++ 12일차  (0) 2021.06.27
C++ 11일차  (0) 2021.06.23
C++ 9일차  (0) 2021.06.21
C++ 8일차  (0) 2021.06.17
C++ 7일차  (0) 2021.06.13

+ Recent posts