일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- map
- UE4 커스텀로그
- C++
- 정렬
- 람다사용정렬
- 언리얼가비지컬렉터
- 자료구조
- 데이터애셋
- 람다
- 델리게이트
- UML관련
- moreeffectiveC++
- enumasByue
- BFS
- 선택정렬
- 스마트포인터
- UE_LOG
- 알고리즘
- 약참조
- stl
- 애셋로드
- 언리얼엔진구조체
- dataasset
- 정렬알고리즘
- C++최적화
- 강참조
- 프로그래머스
- UELOG
- unorder_map
- 크리티컬섹션
- Today
- Total
목록C & CPP (88)
기억을 위한 기록들
둘은 크게 다르지 않지만, using의 장점은 template을 지원한다. #include #include template using my_vector = std::vector; using my_vector2 = std::vector; //vs typedef std::vector my_vector3; //error! //template //typedef std::vector my_vector4; int main() { //using my_vector a; my_vector2 b; //typedef my_vector3 c; return 0; } 참고 : https://unikys.tistory.com/381 [모던C++] typedef vs using 키워드 차이점 기존의 소스 코드에 쓰고 있는 forwa..
언리얼엔진4 소스 UCharacterMovementComponent 를 살펴보던 중 아래와 같은 변수를 발견했다. const float UCharacterMovementComponent::MIN_TICK_TIME = 1e-6f; 여기서 1e-6f은 무슨 뜻일까? 과학적 표기법(scientific notation)으로 위키에 의하면, 과학적 표기법은 너무크거나 너무 작은 숫자들을 다 표기하거나, 사용하기엔 불편해서(?) 십진법으로 편하게 사용하기위해 만든것 같다. 그 중에서도 소수점 관련하여 아랫부분에 1 -> 계수 e -> e는 10이라고 보면 된다 ( 계수 * e). 지수로 10을 제곱하여 확장한다 -6 -> e의 지수 즉, 1e-6f -> 1 x 10^-6 -> 0.000001을 뜻한다. 반대로 1e..
11. 입출력 최적화 파일 읽기 - 저렴한 함수 시그니처 만들기 - 호출 체인 짧게 만들기 - 재할당 줄이기 - 더 큰 입력 버퍼 사용하기 - 한번에 한줄씩 읽기 - 다시 호출 체인 짧게 만들기 파일 쓰기 - std::cin으로 읽어서 std::cout으로 쓰기 12. 동시성 최적화 - 멀티스레드 C++ 프로그램은 경쟁이 없는 경우 순차적으로 일관성이 있습니다. - 임계구역에서 I/O를 실행하면 최적의 성능을 이끌어내지 못합니다. - 실행 가능한 스레드 수는 프로세서의 코어 수보다 작거나 같아야 합니다. - 임계 구역을 짧게 만들기 위해 경쟁하는 스레드의 이상적인 개수는 2개입니다. 13. 메모리 관리 최적화 - 메모리 관리자보다 성능을 향상시킬 수 있는 좋은 장소가 있을지도 모른다. - 똑같은 크기를 ..
7. 문장 최적화 - 문장 수준에서 최적화할 때, 문장의 비용을 크게 만드는 요인이 없다면 성능이 생각만큼 개선되지 않습니다. - 반복문에서 문장의 비용은 반복된 횟수만큼 커진다. 1. 반복문의 종룟값을 캐싱하기 2. 경우에 따라 for문보다 do while문이 더 효율적일 수도 있다. 3. for에서 값 증가보다 감소가 아주 쪼금 더 빠르다.(일부 컴파일러) 4. 반복문에서 불변 코드는 반복문 밖에서 계산하기 5. 반복문에서 불필요한 함수 호출을 제거하시오. 반복 문안에 있는 함수의 호출을 매번 호출해야 하는지 살펴보자. 6. 반복문에서 숨겨진 함수호출을 제거하시오. 대부분 클래스 타입의 변수다. 생성자 소멸자 대입 등이 일어날 때 숨겨진 함수 들일 호출된다. 7. 반복문에서 비용이 크고 변화가 느린 ..
1. 최적화란 - 더 좋은 컴파일러 사용, 최적화 설정 사용 당연히 돼있을 수도 있지만 안 돼있을 수도 있다. - 최적의 알고리즘 사용 사소한것부터 큰 것까지 최적의 알고리즘은 다양하다. 이 내용을 알기엔 모든 나의 커리어를 쏟을 만큼 쉽지 않다. - 더 좋은 라이브러리 사용하기 표준 C++ 템플릿 및 런타임 라이브러리는 유지보수 가능해야 하고, 범용적이고 견고해야 한다. 보통 속도를 신경을 쓰지 않기 때문에 잘 확인해 보며 써야 한다. - 메모리 할당 줄이기 메모리 관리자를 호출하는 횟수를 줄이는 방법 하나만 알고 있더라도 성공적으로 최적화를 할 수 있다고 말할 수 있다. - 복사 줄이기 많은 복사가 메모리 할당과 관련해 발생하기 때문에 하나를 고치면 종종 나머지 하나의 문제도 사라진다. - 계산 제거..
C 스타일의 형 변환(캐스팅)은 이렇다. (T) 표현식 //표현식부분을 T타입으로 형변환합니다. 그리고 함수 방식의 형변환은 문법이 함수 호출 문 같다 T(표현식) //표현식부분을 T타입으로 형변환합니다. 위 2가지는 어떻게 쓰든 구형 스타일의 형 변환이다. 그리고 이제 C++에서의 형 변환은 4가지로 이루어져 있고 새로운 형태의 캐스트 연산자를 독자적으로 제공한다. (신형 스타일 캐스트 혹은 C++ 스타일 캐스트) 1. 객체의 상수 성을 없애는 용도로 사용되는 형 변환. const_cast(표현식) 2. 이른바 '안전한 다운 캐스팅'을 할 때 사용하는 연산자이다. 즉, 주어진 객체가 어떤 클래스 상속 계통에 속한 특정 타입인지 아닌지를 결정하는 작업에 쓰인다. 구현 스타일의 캐스트 문법으로는 흉내 조차..
타입 변환의 기초 클래스 타입 변환을 알아보기 전에 타입 변환의 기초를 살펴보면, int main() { int a = 5; double d1 = a; double d2 = (double)a; double d3 = (double&)a; cout
다중 상속이 어떤 것이고, 어떻게 하는지 등 자세한 설명은 생략한다. 다중 상속의 메모리 구조 한 클래스(Child) 가 두 개의 클래스(A, B)를 상속받게 될 때, 첫 번째로 상속받는 클래스(A)의 시작 주소는 자식 클래스(Child)의 시작 주소와 동일하다. class ParentA { public: ParentA() { mAInt = 5; } int mAInt; }; class ParentB { public: ParentB() { mBInt = 10; } int mBInt; }; class Child : public ParentA, public ParentB { public: Child() { mInt = 100; } int mInt; }; Child 클래스의 객체 child의 주소를 A, B, ..
타입 변환 연산자 클래스에서 타입 변환 연사자를 사용하려면 아래와 같다. operator TYPE() { //변환코드 } 간단한 예를 들어서 어떤 문자열을 입력받으면 자동으로 해당 문자열의 길이를 출력해보도록 하자. #include #include using namespace std; class MyClass { public: MyClass(string& str) { mLength = str.length(); } operator int() //타입변환 연산자 { return mLength; //문자열길이 반환 } int mLength; }; int main() { string helloStr = "Hello"; MyClass a(helloStr); int length = a; //타입변환 연산자 cout
등가 연산자 좌변 우변이 같은지, 다른지(==, !=)를 평가하는 연산자이다. 등가라는 개념은 대입이라는 개념과 함께한다. int a = 3; int b = 3; if(a == b) //ok { std::cout
생성자와 소멸자 클래스 객체가 생성될때 생성자가 호출하고, 사라지기 직전에 소멸자가 호출된다. 따라서 초기화작업이나 자원 마무리를 각각 생성자와 소멸자에서 처리해주면 된다. 암시적 생성자와 소멸자 컴파일러는 생성자나 소멸자가 특별히 필요하지 않다면 굳이 암시적으로 생성자,소멸자를 정의하지 않는다. 하지만, 명시되어있지 않지만, 반드시 필요한 경우라면 컴파일러는 암시적인 생성자와 소멸자를 정의한다. 암시적으로 생성되는 예) #include using namespace std; class A { public: A() { cout
예를 들어 어떤 함수안에서 어떤 변수를 선언해놓고 그 변수를 사용하기도전에 예기치 못한 상황으로 해당 함수를 탈출하게 되면 해당 변수는 사용해보지도 못하고 선언만 해놓고 다시 소멸하게 된다. void DoSomething() { //.. Player tempPlayer; if(/*어떤 상황으로 인한*/) //if안에 들어가면 tempPlayer는 생성과 소멸만하고 끝난다. return; //탈출 //tempPlayer 객체의 사용 //.. } 이런것들은 위해 최대한 사용하기 직전에 변수를 정의하자. void DoSomething() { //.. if(/*어떤 상황으로 인한*/) return; //탈출 Player tempPlayer; //tempPlayer 객체의 사용 //.. } 그리고 어떤 루프문을 ..