C++ 팁

CJB_ny·2022년 11월 14일
0

C++ 정리

목록 보기
91/95
post-thumbnail

C++ 팁

mem padding ❗

mem 조금 낭비하더라도 access를 위해 이렇게 padding을 넣는다.

virtual function

  • dynamic function binding

    프로그램이 실행될 때 함수가 binding된다는 것이다.

반대로

  • static function binding

    Complie Tile에 바인딩 한다.

그러면

현재 virtual function넣으면 table 포인터가 들어가서 8바이트(64비트 일 경우)가 추가가됨.

그러면 sizeof(B)의 크기는 전체

16바이트이다.

i4(4byte)padding (4byte)table(8byte)

이렇게 8의 배수번째에 빠르게 접근하기 위해서

4바이트 mem padding을 만들어서 16바이트가 된다.

speak라는 함수는 컴파일 타임이 아니라 런타임에 바인딩 되어서 호출됨.

is -a, has-a

Design Pattern 에서 많이 사용하고

JAVA하는 애들이 많이 좋아한다? ㅋㅋ

그냥 OOP에서 사용되는 개념이다.

상속에서.

is-a, has-a 관계인지 따지는 것프 규모가 커지면 말이 안되고

dynamic function binding이 정말 필요한지 부터 검토를 해야한다.

std::string

Mordern은

sizeof(std::string) == 32byte이고

이 안에 ptr, size, capacity정보가 들어있고

ptr이 Heap을 가르키는 형태이다.

문자열의 크기가 16바이트? (32바이트?) 미만이라면은 그냥 스택에다가 올린다.

즉, 일정 사이즈 미만 string은 힙이 아니라 -> 스택에 올라가서 performance가 증가함.

C++17부터는 string_view라는 것을 사용하면 더 좋다.

extern vs static

static의 두가지 의미

    1. link
    1. scope block

link 알아볼 것이다.

먼저 Build Process를 보면은

a.cpp파일은 #include a.h, #include b.h를 하여 obj파일이 나오고

b.cpp는 #include b.h를 하여 obj파일이 나와서

두개의 obj파일을 linking단계에서 link를 해준다음에

.exe파일을 만들어주는게 build Process이다.

extern사용하면은 extern은 밖에 있는 a를 가져다 쓰겠다가 되는 것이다.

static은 global barriable 키워드라

a.cpp의 범위에서 나가지 못한다.

즉, 하나의 translation unit안에서만 접근이 가능하게 하여 밖으로 link를 막는 방법이다.

Static

c++에서 3가지 의미를 가진다.

internal linkage

첫번째가 extern과 비교해서 설명한 부분이고.

이 경우에는 n이 data영역에

첫번째 의미로 본다면은 data에 올라가지만

internal linking로 강제한다는 것이다.

두번째 의미

세번째 의미

클래스안에 있을 경우

static 변수 선언 위치 ❗❗❗

c++17이전까지는

이런식으로 initializaion을 해주어야 사용이 가능한데

.h에 선언이 들어가있고 .cpp파일에 정의가 다 되어있는데

main.cpp같은 파일에서는 .h파일만 가져오는데

static변수의 정의 부분을 .h에 넣게 되면은

#include때문에 .cpp에서도 컴파일이 되고

main.cpp에서도 컴파일이 된다.

그래서

link단계에서 충돌이 일어난다.

static변수의 선언은 header에서 했을 지라도 정의는 .cpp파일에서 해야한다.

Singletone

class의 instance를 '싱글'(하나로)만 하겠다라는 것이다.

잘못된 싱글톤

오브젝트는 Heap에다가 Allocation을 시키는데

포인터를 data공간에 선언해놓고

포인터를 반환해서 사용하는 방식의 싱글톤이 있는데

이거 문제점이

free사용하거나 nullptr일 경우 망가진 싱긑톤이다.

가장 좋은거는 data공간에 오브젝트를 생성시키고 ref만 가져와서 사용하는게 제일 좋음.

이런 구조가 제일 좋음.

내가 win32API하면서 사용했던 것은

자세히 보면은 객체를 data에 올리고 해당 객체의 주소를 반환함. 같은 방식이다.

굿굿.

그리고 이런 부분 delete해주어야됨.

싱글톤인데 복사되는게 말이 안되니까.

근데 이부분 조금 기니까 win32API 처럼

이렇게하면 프로젝트를 실행하는 순간 data에 오브젝트 만드는 거고 (정의도 밖에 따로 해야되서 귀찮다)

이런식으로 해준다.

정리하자면

데이터 공간에 오브젝트 하나만 만들어서 사용을 한다.

Function overloading

override는 재정의

overload는

Sum(int a, int b), Sum(int a, int b, int c) 이게 overloading임.

'원리'를 이해해야함.

overloading과 관련된 키워드는 "Name Mangling" 이다.

같은 이름의 함수를 반환형과 매개변수 타입으로 구분하는 마법같은 기능을 당연하게 사용을 하는데

실제로는 Name Mangling을 사용해서 function overloading을 진행을 한다.

(함수도 포인터 이다)

name mangling은 컴파일마다 좀 다르다.

virtual function은 run time에 바인딩 되고

function overloading의 경우에는 static function binding이라 컴파일 시간에 바인딩이 됨.

클린 코드, 얼리 리턴

Early Return 은 GPU프로그래밍을 할 때 많이 사용하는 pattern이다.

읽기 편하게 되는데

GPU프로그래밍에서 이 Early Return이 꼭 필요한 이유

이게 그냥 Early Return이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글