분류 전체보기
C# 구조체 (struct) 클래스 (class) 차이
struct 코드 struct Point { public int X; public int Y; public int Z; public Point(int x, int y, int z) { this.X = x; this.Y = y; this.Z = z; } public static Point operator +(Point p1, Point p2) { return new Point(p1.X + p2.X, p1.Y + p2.Y, p1.Z + p2.Z); } public String toString() { return "x: " + X + ", y: " + Y + ", z: " + Z; } } class 코드 class Point { public int X; public int Y; public int Z; pub..
C++ 바이트 패딩 (Byte Padding)
왜 컴파일러는 구조체의 메모리를 정렬해 놓을까? 적은 수의 컴파일러는 구조체의 필드를 메모리에 위치시킬 때, 중간 빈 공간 없이 쭉 이어서 할당한다. 하지만 대부분의 컴파일러는 성능 향상을 위해 cpu가 접근하기 쉬운 위치에 필드를 배치하는 데 이를 구조체 패딩이라고 한다. 그리고 중간 빈 공간에 들어간 것을 패딩 비트라고 한다. 참고로 os 32bit 환경에서는 4byte packing 방식이 빠르고 os 64bit 환경에서는 8byte packing 방식이 빠르다고 한다. 왜 빠를까? 패딩 비트가 없을 경우 어떤 일이 일어나는지 생각해보자. cpu는 메모리를 읽어올 때 한 번에 32bit os : 4byte 혹은 64bit os : 8byte를 읽어온다. class Test { char _c1; //..
선형 보간법 (linear, bilinear, trilinear interpolation)
1D 선형보간법(linear interpolation)을 2D로 확장한 bilinear interpolation과 3D로 확장한 trilinear interpolation이 어떤 식으로 이루어지는지와 이러한 interpolation 기법이 히스토그램(histogram)에 적용된다. 1. Interpolation과 Extrapolation Interpolation(인터폴레이션, 보간)이란 알려진 지점의 값 사이(중간)에 위치한 값을 알려진 값으로부터 추정하는 것을 말한다. Extrapolation은 알려진 값들 사이의 값이 아닌 범위를 벗어난 외부의 위치에서의 값을 추정하는 것을 말한다. 예를 들어, 어떤 사람이 20살일때 키와 40살에서의 키를 보고 30살에서의 키를 추측하는 것은 interpolatio..
사원수 (Quaternion : 쿼터니언)
1. 사원수 (Quternion)이란? 3차원 그래픽에서 회전을 표현할 때, 행렬 대신 사용하는 수학적 개념으로 4개의 값으로 이루어진 복소수(Complex Number) 체계이다. 사원수는 행렬에 비해 연산 속도가 빠르고, 차지하는 메모리의 양도 적으며, 결과의 질에 있어 오류가 날 확률이 적다. 3개의 축에 대한 회전 연산을 동시에 적용하는 경우에 행렬을 사용하면 한 축이 소실되는 짐벌락 현상이 발행할 수 있는데, 사원수를 사용하면 이 현상을 막을 수 있다. 2. 사원수의 정의 사원수는 4차원 복소수 공간(Complex Space)의 벡터로서 다음과 같이 나타낸다. 사원수를 q = s + v 형태로 쓰기도 하는데, 여기서 s 는 q의 w 성분에 해당하는 스칼라(Scalar) 값이고, v는 q의 x, ..
짐벌락 & 오일러 각 (Gimbal Lock & Euler Angle)
1. 짐벌이란? 그림에서는 roll pitch yaw 세개가 바로 그 단일축이다. 자세히 보면 각각의 고리는 본인이 가진 축을 기준으로만 회전한다.각각의 고리는 각자의 단일축으로 회전하는데도 불구하고 파란 고리가 축에 관계없이 모든 방향으로 회전하는 것처럼 보이는 이유는 바로 고리들이 서로 연결되어있기 때문이다. 고리가 다른 고리에 자식으로 붙어있는 관계이기 때문에 각 축은 서로 종속적이다. 실제로 이러한 구조물을 선박에서는 자이로스코프, 나침판, 난로, 그리고 컵홀더까지 전후좌우로 흔들리더라도 수평을 이루도록 할 때 많이 쓰인다고 한다. 2. 오일러 각이란 오일러 각이란 오일러가 도입한 강체(rigid body)의 회전 시스템이다. (강체란 평행이동과 회전만 가능한 물체) 어떠한 강체가 3차원 공간 상..
[Unreal] C++ 버전 변경(C++ 20기능 사용) 방법과 모듈
언리얼에선 디버그 속성 통해 전체 .sln 파일에 대해 언어를 지정 할 수가 없다. UE 5 기준 전체 언리얼 모듈들은 C++ 17버전으로 작성 되어있다, 따라서 20 버전으로 업그레이드 한 후 참조할 때 에러가 날 수 있다. 각 모듈 Build.cs 파일 내에 // CppStandardVersion.Latest 즉 최신 버전 설정 시 17 버전으로 설정 됨. CppStandard = CppStandardVersion.Cpp17; // C++ 20 기능 사용하고자 할 때 아래와 같이 작성하면 된다. CppStandard = CppStandardVersion.Cpp20; 아래는 현재 사용하고 있는 직접 구현한 모듈들이다. Objects 같은 경우엔 탄알(파티클 이펙트) Niagara System을 사용해야..
C++ 참조 대상 수 (Reference Counting)
Reference Counting은 객체의 소유권 관리( = 라이프 사이클 )의 방법 중 하나로 객체를 참조(포인팅) 하고 있는 횟수를 추적하여 그 횟수가 0이 되면 메모리에서 해제(소멸)한다. 대부분의 Managed Language (python, c#, swift등 메모리 관리를 직접 하지 않는 언어 ) 에서 널리 사용되고 있다. 장점 - 메모리를 직접 해제하는 번거로움이 사라진다. - 객체의 소유권을 공유할 수 있다 - 객체 관리 매커니즘이 비교적 단순해서 빠르다. (Garbage Collection) 단점 - 순환 참조 문제가 있다. c++ 에서의 구현방식에는 크게 두가지가 있다. Intrusive Reference Counting (침습성 참조 카운팅) - 객체에 대한 참조 카운트가 "내장" 되..
C++ 순환 참조 (Circular Dependency) & 데드락
순환 참조 문제는 비단 Reference Counting 뿐만이 아니라 다양한 영역에서 이를 피하는것이 매우 중요하다. 설계적 관점에서, 서로 참조를 하는 두 객체가 있다면 의존 관계가 양방향이 되고 의존성(Dependency)이 커지기 때문에 코드 관리에 어려움이 생긴다. 멀티 스레드( or 프로세스 ) 환경에서는 Resource를 점유한 상태로 새 Resource의 요청이 "순환"하는 경우 교착 상태(Dead Lock)에 빠지게 된다. class ObjectA { public: ObjectA() { std::cout
Thread 사용법 및 생성
thread 생성 방법 1) C 스타일 thread 생성 (함수 포인트 활용) thread(thread로 돌릴 함수, 넘길 인자); 2) Class의 Static 함수를 사용한 Thread 생성 thread(Class명:thread로 돌릴 함수, 넘길 인자); 3) Class의 멤버 함수를 사용한 Thread 생성 thread(Class명:thread로 돌릴 함수, Class 생성자, 넘길 인자); 4) lambda 를 사용한 Class 멤버 함수 Thread 생성 static이 아닌 클래스의 멤버함수를 Thread로 돌릴 수 있다. 5) lambda 를 사용한 Thread 생성 thread로 돌릴 내용을 바로 생성 한다. #include #include using namespace std; /* * 함..
데드락 (Deadlock) 의미 & 조건
데드락(Deadlock)이란? 멀티 프로그래밍 또는 멀티 스레드 환경에서는 여러 프로세스 또는 스레드가 한정된 자원을 동시에 사용하기 위해 항상 경쟁 상태에 놓여 있고 프로세스가 필요한 자원을 획득하지 못하고 영원히 자원을 기다리는 상태이다. 시스템 모델 설명 자원이란 CPU, 파일, 메모리, 락객체(세마포어나 뮤텍스 같은 Synchronize Object) 등등 컴퓨터 시스템에서 여러분이 사용할 수 있는 모든 것들을 총칭하는 추상적인 용어다. 요청(Request) : 프로세스가 특정 자원을 시스템에게 요청하면 시스템은 현재 이 자원이 사용 가능하다면 프로세스에게 할당 한다. 불가능하다면 자원이 사용 가능해 질 때까지 기다린다(Wait state). 사용(Use) : 자원에 대한 허가가 떨어지면 프로세스..