분류 전체보기
C# 힙 구조 (Heap)
스택은 단순히 데이터를 넣고 뺄 수 있는 구조이며, System.ValueType을 상속하는 기본 데이터형(int, long, bool 등)만 저장할 수 있다. 힙은 예약된 주소 공간을 뜻한다. 최초에 프로세스가 초기화될 때 시스템은 프로세스 주고 공간 내에 하나의 힙을 생성한다. 이 힙을 프로세스의 기본 힙이라 하며, 기본 할당 크기는 1M로 정해져있다. 닷넷에서는 가비지 컬렉터가 자원을 관리하기 때문에 힙에 대한 함수를 직접 제공하지 않지만 Win32 API GetProcessHeap() 사용하여 현재 프로세스의 힙을 가져올 수 있다. using System.Runtime.InteropServices; public unsafe class Memory { static int ph = GetProcess..
C# 원자적 연산 (Interlocked 클래스)
Interlocked 클래스는 int 형 값을 증가시키거나 감소시키는데 사용한다. 멀티 스레드 환경에서 하나의 int 형 전역 변수를 공유한다고 생각해보자. 이런 경우에 A 쓰레드와 B 쓰레드가 값을 동시에 읽어와서 B 쓰레드가 수정한 값을 저장하고, A 쓰레드가 다시 수정한 값을 저장하게 되면 B 쓰레드의 변경사항을 잃어버리게 된다. 지금까지 이러한 자원의 동기화를 위해서 모니터나 뮤텍스를 사용하는 방법을 설명했지만 간단한 int 형의 값을 여러 쓰레드가 공유하는 것이 일반적이기 때문에 이러한 작업을 캡슐화한 클래스를 제공한다. Interlocked 클래스는 System.Threading 클래스에 있으며 주요 멤버는 다음과 같다. 메소드 이름 설 명 CompareExchange 두 대상을 비교하여 값이..
C++ 원자적 연산 (atomic)
뮤텍스를 통해서 전역 변수를 동기화하여 하나씩 증가시킬 수 있다. 그러나 뮤텍스와 같은 lock을 이용하여 개발하는 경우, 사용자가 잘못 사용할 때 교착 상태와 같은 문제를 야기시킬 수 있다. C++11에서는 atomic을 이용하여 뮤텍스와 같이 lock, unlock을 사용하지 않고 값을 증가시키거나 값을 감소시킬 수 있는 기능을 제공하고 있다. atomic : atomic 변수를 선언할 수 있는 데이터형. fetch_add : atomic의 멤버 함수로, 값을 증가시키는 함수. fetch_sub : atomic의 멤버 함수로, 값을 감소시키는 함수. atomic으로 설정된 변수에는 초기에만 값을 대입할 수 있다. 그 이외에는 대입이 불가합니다. 대신 값을 증가, 감소 시키는 역할만 수행한다. 그 이유..
C++ 스마트 포인터 (Smart Pointer)
C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 하는데, 만약 해제하지 않고 넘어갈 경우에 메모리 누수 (Memory Leak) 문제가 발생해서 프로그램의 안정성을 보장받을 수 없게 된다. 스마트 포인터는 클래스 템플릿으로서 사용이 끝난 메모리를 자동으로 해제해주어 메모리 누수 문제가 일어나지 않도록 해준다. 동작하는 방법은 기본 포인터 (Raw Pointer)가 실제 메모리를 가리키도록 초기화한 후에, 기본 포인터를 스마트 포인터에 대입하여 사용된다. 스마트 포인터의 종류 C++ 11 표준 이전에도 auto_ptr 이라는 스마트 포인터로 작업을 처리했었는데, 현재 모던 C++ 이라 불리우는 C++ 11 이상의 표준에 대해서는 aut..
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을 사용해야..