글

라벨이 필기노트인 게시물 표시

230131) UE4 - SpawnEmitter의 AutoDestroy와 PullingMethod의 특성

이미지
 AutoDestroy : 대상이 돌아갈 풀이 존재하지 않을 때 재생이 끝나면 자동으로 Destroy해주는 옵션이다. PoolingMethod None : 대상은 돌아갈 Pool이 존재하지 않아 Spawn코드를 통해 재사용되지 않는다. AutoRelease : 대상은 돌아갈 Pool이 존재하며, 재생이 끝나면 Pool에 돌아가 Spawn코드를 통해 재사용된다. ManualRelease : 대상은 돌아갈 Pool이 존재하며, 수동으로 Release해줘야 Pool에 돌아간다.  ( https://cafe.naver.com/sgagpc/2679  에서 일부 발췌)

220930) RGBA, 알파테스트, 알파블렌딩, 알파소팅, Z-fighting

이미지
RGBA RGB 색상값에서 '알파 채널 값'을 더한 색상값이다. 알파값이란 텍스처에서 투명도를 나타내기 위한 값이며, RGB값처럼 0~1까지의 범위를 가진다. 알파테스트 임의로 설정한 값을 기준 으로 알파채널의 값에 따라 결과값을 1, 없으면 0으로 판단하여 투명도를 결정하는 방법 으로, 간단명료하여 연산속도가 빠르지만 , 중간값이 없어 반투명이 존재하지 않는다. --- 알파블렌딩 대상(Dest)에 원본(Src)을 변경/조합해서 픽셀 색을 조정하는 방법. 투명도를 세밀하게 주어 반투명을 표현할 수 있는 방법이며, 반투명한 객체가 여러 장 겹쳐있어도 전부 보이는 것처럼 모든 픽셀은 언제나 보일 수 있다는 것을 전제로 작동한다. 때문에 깊이 테스트를 하여 위치 값을 재정렬하고, 다시 찍어서 모든 픽셀의 색상을 전부 계산해야 하기 때문에 처리속도가 느리다. --- 알파 소팅 실시간 렌더링에서 처리속도를 올리는 기법 중 하나. 일반적으로 알파가 없는 오브젝트 들은 화면 앞쪽 오브젝트 부터 뒤쪽 오브젝트 까지 순서대로 렌더링 하는 것이 가려진 오브젝트를 렌더링하지 않아도 되기 때문에 처리속도가 빠르다.  그러나 알파값이 있는 오브젝트는 앞에 그리더라도 뒤쪽 오브젝트를 그려야 하기 때문에 위처럼 처리할 수 없다. 알파값이 있는 오브젝트 는 반대로 뒤쪽부터 그린다. 이처럼 알파값이 있는 오브젝트 와 없는 오브젝트 를 따로 그려 렌더링하는 기법을 알파 소팅 이라 한다. Z-Fighting 두 개의 폴리곤이 유사한 Z깊이 값을 가지고 있어 두 객체가 눈에 깜빡거리듯이 번갈아 나타나는 증상 을 가리킨다. 이는 두 객체 중 무엇을 우선적으로 렌더링을 해야 하는지 알 수 없어 발생하는 현상이기 때문에 이를 해결하기 위해서는 개발자가 표현하고자 하는 순서를 명확하게 제시할 필요가 있다. 순서를 명확히 하는 방법은 여러가지가 있다. 1. Z축의 소수점 단위로 수치를 조절하는 방식 2. 카메라의 near와 far plane값을 조절하는 방식 (카메라에 근접할수록 ...

220825)함수 포인터, Lambda 함수, thiscall

이미지
함수 포인터 함수의 주소를 가리킬 수 있는 포인터 변수. [ (반환값 자료형) (*포인터명) (매개변수 자료형...) ]의 꼴로 선언할 수 있다. 선언한 포인터의 반환값 과 매개변수 와 같은 자료형 을 가진 함수를 저장할 수 있다. (예시) 함수 포인터 선언: float (*fp)(int, int); 저장할 수 있는 함수: float Func(int a, int b); 함수를 포인터에 저장: fp = Func; 함수 포인터를 통한 호출: fp(3, 5); C++ 11부터는 using을 사용하면 특정 함수 포인터에 대한 별칭을 만들 수 있다. using funcPt = float(*)(int, int); 또한 C++ 11부터 표준 라이브러리 <functional> 헤더를 통해 std::function 을 사용한 함수 포인터의 정의가 가능하다. ---- #include <functional> std::function<float(int, int)> funcPt; funcPt = Func; // float Func(int a, int b)꼴로 선언된 함수; funcPt(3, 5); ---- Lambda 함수 익명의 함수를 정의할 수 있는 방법. 함수가 호출되거나 인수로 사용되는 위치에서 즉석으로 함수를 정의하여 캡슐화하는 데에 사용된다. 람다식은 다음과 같이 정의한다. --- [캡쳐 블록]( 매개변수 목록 ) mutable throw() -> 반환자료형 { 함수 내용 } ※ 기울임체는 생략가능한 코드 --- 자세한 참조:  https://jungwoong.tistory.com/51 함수 호출 규약 - thiscall 함수의 호출 규약은 함수 호출 시 전달된 매개변수를 함수가 종료될 때 정리하는 방법으로서 cdecl, stdcall, fastcall, thiscall 4가지가 존재한다. 이 중 thiscall 은 C++언어의 멤버함수에서 쓰이고 나머지는 C언어에서 사용된다. thiscall은 ecx에 인스턴스의 주...

220823)임계영역, 교착상태

이미지
임계 영역(Critical Section) 두 개 이상의 스레드가 공유자원에 접근할 때, 오직 한번에 하나의 스레드만의 독점을 보장해줘야하는 자원을 일컫는다. 임계 영역은 지정된 시간이 지난 후 종료되며, 어떤 스레드가 임계 영역에 들어가고자 한다면 지정된 시간 만큼 대기해야 한다. 스레드가 공유자원의 배타적인 사용을 보장받기 위해서 임계 영역에 들어가거나 나올 때는 세마포어 같은 동기화 매커니즘이 사용된다. 참조:  https://ko.wikipedia.org/wiki/%EC%9E%84%EA%B3%84_%EA%B5%AC%EC%97%AD --- 교착 상태 (Dead Lock) 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 뜻한다. 데드락 이 발생하기 위한 조건은 다음과 같다. 상호배제: 한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 점유대기: 자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다. 비선점: 이미 할당된 자원을 강제로 빼앗을 수 없다. 순환대기: 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다. 위 네 가지를 하나라도 발생하지 않도록 하는 것이 데드락을 예방하는 방법이다. 시스템의 프로세스들이 요청하는 모든 자원을 할당해주면서도 데드락을 발생시키지 않는다면 '안정 상태(safe state)' 에 있다고 말한다. 참조:  https://chanhuiseok.github.io/posts/cs-2/

220822)멀티 프로세싱, 멀티 스레딩, 동기, 비동기

이미지
멀티 프로세싱(Multi Processing) 다수의 프로세서가 여러 작업을 함께 처리하는 것을 뜻한다. ※프로세서: 프로그램을 수행하는 하드웨어 유닛 (프로세스와는 다름) --- 멀티 스레딩(Multi Threading) 일반적으로 하나의 프로세스는 한 개의 스레드를 가지고 작업을 수행한다. 그러나 멀티 스레드를 사용하면 하나의 프로세스 내에서 둘 이상의 스레드를 사용해 작업을 수행할 수 있다. 멀티 스레드는 각 스레드가 자신이 속한 프로세스의 메모리를 공유 하기 때문에 시스템 자원의 낭비를 줄일 수 있으며, 여러 스레드가 작업을 보조하기 때문에 사용자와의 응답성이 좋아진다. 참고:  http://www.tcpschool.com/java/java_thread_multi 동기(Synchronous) 요청과 결과가 동시에 일어날 것이라는 약속을 한 상태. 요청을 하면 결과가 반드시 주어져야 한다. 간단하고 직관적 인 방식이지만 결과가 도착할 때 까지 아무것도 안하고 대기해야 한다 는 특징이 있다. --- 비동기(Asynchronous) 요청과 결과가 동시에 일어나지 않는다는 약속을 한 상태. 요청에 따른 결과가 보장되지 않는다. 동기방식보다 복잡하나 , 결과가 도착하는 데에 시간이 걸리더라도 그 동안 다른 작업을 진행할 수 있어 자원을 효율적으로 사용할 수 있다 는 특징이 있다. 참고:  https://private.tistory.com/24

220819) GPGPU (General-Purpose computing on Graphics Processing Units)

 GPGPU(General-Purpose computing on Graphics Processing Units, GPU 상의 범용 계산) GPGPU 는 일반적으로 컴퓨터 그래픽스를 위한 계산만 맡았던 그래픽 처리 장치(GPU)를, 전통적으로 중앙 처리 장치(CPU)가 맡았던 응용 프로그램들의 계산에 사용하는 기술 이다. 이를 가능하게 한 것은 프로그램 가능한 층과 고정도 연산을 그래픽 파이프라인에 연결하는 것으로, 이를 통하여 소프트웨어 개발자들이 그래픽이 아닌 데이터에 스트림 프로세싱을 사용할 수 있게 된다. GPGPU로 CPU 한 개에 비해 100배~250배의 속도 향상을 이룰 수 있지만, 병렬도가 지극히 높은 응용 프로그램에서만 이 정도의 혜택을 볼 수 있을 것이다. 한 개의 GPU 처리 코어는 데스크톱 CPU의 코어 한 개와 대등하지 않다. 출처 :  https://ko.wikipedia.org/wiki/GPGPU

220726) 사원수(Quaternion), 오일러회전(Yaw,Pitch,Roll), 짐벌락(gimbal lock)

이미지
사원수(Quaternion) a+bi+cj+dk 형태의 수(a,b,c,d는 실수)이다. 다음과 같은 성질을 만족시킨다. ※ 사원수의 곱셈은 교환법칙을 만족시키지 않는다. 어떤 물체의 자세를 기준좌표계에 대하여 표현할 때, 단위벡터 (e1,e2,e3)에 대하여 θ만큼 회전한 자세는 사원수로 다음과 같이 표현한다. 사원수는 4개만의 적은 개수의 숫자로 회전을 표현하여 효율적인 계산을 할 수 있다. 오일러각도와 YawPitchRoll 축을 통한 회전에는 두 가지 방법이 존재한다. 1. 오일러 각도를 통한 회전(post-multiplication, 행렬을 뒤에 곱하는 방법) 2. YawPitchRoll을 통한 회전(pre-multiplication, 행렬을 앞에 곱하는 방법) ----- 오일러 각도 강체의 자세를 좌표축의 회전으로 표현하는 여러 방법 가운데 하나로, 3x3 회전행렬을 직관적으로 이해하고 행렬의 원소를 단 3개의 Parameter로 간략하게 표현하기 위해 사용하는 방법이다. (Z축을 기준으로 θ만큼 회전했을 때의 행렬) ----- Yaw, Pitch, Roll 강체의 자세를 '고정된' 회전축을 기준으로 회전을 표현하는 방법이다. Roll: x축을 기준으로 회전한 각도 Pitch: y축을 기준으로 회전한 각도 Yaw: z축을 기준으로 회전한 각도 이를 행렬으로 표현하면 다음과 같다. 짐벌락 현상(Gimbal lock) 같은방향으로 오브젝트의 두 회전 축이 겹치는 현상. 짐벌락이 발생하는 경위는 다음과 같다. 1. x축, y축, z축 각각의 회전행렬을 만든다. yaw(y축 회전각) pitch(x축), roll(z축) 2. 회전 행렬을 객체의 변환행렬과 각각 순서대(x, y, z)로 곱한다.(오일러각) 3. x축을 90도 틀고난 후 y축으로 90도 튼것과    y축을 90도 틀고난 후 z축으로 90도 튼것과의 회전 값이 같다. 4. 세 개의 축 각을 이용하여 항상 순서대로 회전을 하면 위와같이 한 개의 축이...

220725) 키프레임 애니메이션, 스키닝 애니메이션

이미지
키프레임 애니메이션 애니메이션에서 객체의 정보들을 보유한 두 개의 키프레임 사이의 객체들의 움직임을 보간하는 방법이다. (※프레임: 애니메이션에서 출력되는 한 장면, 초당 프레임개수가 클 수록 움직임이 부드럽다) (예시: 객체의 시간에 따른 위치를 선으로 표현, 선은 점 <키프레임> 에 대한 정보에 기반하여 그려진다) ----- 스키닝 애니메이션 메시를 구성하는 정점(Vertex) 을 ' 뼈대(Bone) '에 링크하여 뼈대 의 좌표에 따라 정점 을 움직이게 하는 기술. 뼈대 의 중량(weight) 에 따라 링크된 정점 에 영향을 미치는 정도가 달라지며, 한 정점 에 링크된 모든 뼈대 의 중량 의 합은 1.0이다. 정점 의 위치를 결정하는 최종변환 행렬은 그 정점 에 링크된 모든 뼈대 의 중량 과 변환행렬을 곱한 것들의 합이 된다. Stages for preparing a character (modeling, rigging, and skinning) 사진출처:  https://docs.unity3d.com/Manual/UsingHumanoidChars.html

220712) 포워드 렌더링, 디퍼드 렌더링, PBR(물리기반 렌더링), 퐁쉐이딩, Ambient Light, Diffuse Light, Specular Light

이미지
포워드 렌더링 전통적인 렌더링 방식, 3D공간에 존재하는 폴리곤을 픽셀화하여 그 픽셀마다 쉐이딩과 라이팅을 더한다. 장점 - 저사양에서도 작동 - PC에서는 안티앨리어스 처리를 하드웨어에서 지원받으므로 거의 완벽한 처리가 됨(반투명 처리도 문제없다) - 가장 오래된 렌더링 방식이기 때문에 생겨난 문제에 대한 해결책도 어느정도 존재함 - 해상도가 올라가도 요구하는 메모리가 디퍼드 렌더링에 비해 적음 단점 - 라이팅 연산이 느림 - 수많은 오브젝트가 있는 배경이나 폴리곤이 많은 모델을 상대로 하기 어렵다 - 그림자 처리가 어려움 - 화면 깊이값을 이용한 포스트 이펙트는 따로 처리해주어야 함 --- 디퍼드 렌더링 한 화면에 수많은 라이팅 효과를 넣기위해 사용하는 렌더링 기법, 라이팅 기법을 먼저 하지 않고 미루었다 실행하기 때문에 '지연 쉐이딩'  이라고도 부른다. [폴리곤 픽셀화->정보를 나누어 비디오 메모리에 저장->각종 쉐이더와 라이팅효과를 거쳐 화면에 표현] 하는 순서를 가진다. 장점 - 수많은 동적라이팅을 실시간으로 보여줄 수 있음 - 그림자를 손쉽게 그릴 수 있음 - 쉐이더를 간단하게 지원해줄 수 있음 - 픽셀정보를 메모리에 저장함으로서 생기는 이점 활용가능(ex:화면의 깊이값을 이용한 특수효과 등) - 수많은 오브젝트와 복잡한 모델링을 표현할 때 유리 단점 - 뒤에 그려지는 오브젝트 정보가 비디오 메모리에서 소실됨 (알파가 빠지는 오브젝트 표현x) - 요구하는 하드웨어 사양이 높음 - 해상도가 올라갈수록 요구 비디오 메모리가 기하급수적으로 늘어남 - 안티앨리어스를 구현하기 까다로움 --- PBR(물리 기반 렌더링) 물리 기반 쉐이딩(PBS)이라고도 불리는 물리 기반 렌더링(PBR)은 조명과 재질 속성의 상호 작용 방식을 정확하게 구현하는 쉐이딩 및 렌더링 기법. PBS는 쉐이딩에 특화된 것이고, PBR은 렌더링과 조명을 위한 기법으로 3D 모델링 워크플로우에 따라 적절히 사용할 수 있다. 두 가지 모두 물리적으로 정확한 지점에서...

220629) Smart Pointer

스마트 포인터(smart pointer) C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다. C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다. 스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다. 보통 new 키워드를 사용해 기본 포인터(raw pointer)가 실제 메모리를 가리키도록 초기화한 후에, 기본 포인터를 스마트 포인터에 대입하여 사용합니다. 이렇게 정의된 스마트 포인터의 수명이 다하면, 소멸자는 delete 키워드를 사용하여 할당된 메모리를 자동으로 해제합니다. 따라서 new 키워드가 반환하는 주소값을 스마트 포인터에 대입하면, 따로 메모리를 해제할 필요가 없어집니다. 스마트 포인터의 종류 C++11 이전에는 auto_ptr이라는 스마트 포인터를 사용하여 이 작업을 수행하였습니다. 하지만 C++11부터는 다음과 같은 새로운 스마트 포인터를 제공하고 있습니다.   1. unique_ptr 2. shared_ptr 3. weak_ptr   스마트 포인터는 memory 헤더 파일에 정의되어 있습니다. --- unique_ptr unique_ptr은 하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록, 객체에 소유권 개념을 도입한 스마트 포인터입니다.   이 스마트 포인터는 해당 객체의 소유권을 가지고 있을 때만, 소멸자가 해당 객체를 삭제할 수 있습니다. unique_ptr 인스턴스는 move() 멤버 함수를 통해 소유권을 이전할 수는 있지만, 복사할 수는 없습니다. 소유권이 이전되면, 이전 unique_ptr 인스턴스는 더는 해당 객체를 소유하지 않게 재설정됩니다. -...

220621) Space(Matrix), view, projection, NDC, viewport

이미지
Space (Matrix적 의미) 오브젝트를 '공간'에 잡아두기 위한 행렬을 일컫는다. 모든 오브젝트는 각자 ' SRT Transform' 이 포함된 고유의 Space를 가지고 있는데, 하나의 오브젝트를 구성하는 작은 부품들은 Local Space 를 중심으로 구성되어있으며, 구성된 오브젝트는 장면을 구성하는 World Space 를 중심으로 배치될 위치가 결정된다. 장면이 완성되면 View Space 에서 장면 내 오브젝트들을 바라보는 시선(방향)이 결정되며, Projection Space 를 통해 우리들의 눈에 어떻게 투영될 지를 결정한다. 이렇게 완성된 Clip Space 는 Viewport 변환을 통해 어디까지 윈도우에 표현할 지를 결정할 수 있다. --- View Matrix World Space 를 바라볼 위치를 결정하는 행렬이다. View Matrix 는 카메라에 비유되고, View Space 는 카메라로 바라본 세계에 해당한다. --- Projection Matrix 카메라로 바라본 세계를 어떻게 투영할 지를 결정하는 행렬이다. Projection하는 방법으로는 크게 ' Orthographic projection', 'Perspective projection' 이 있다. Perspective : 원근법이 적용되는 3D 화면에서 주로 사용됨. Orthographic : 직각 투영, 원근법이 없는 2D 화면에서 주로 사용됨. --- NDC (Normalize Device Coordinate) [Clip Space] 사용자가 모니터 속 게임의 화면을 볼때, 3D로 이루어진 공간이 렌더링을 통해 2D로 변환된 화면을 바라보게 되는데, 이것을 투영이라 부른다. 이때, 사용자가 모니터에 비친 2D의 상을 바라봤을 때 2D투영 평면이 가지는 좌표계를 NDC , 또는 Clip Space 라고 한다. 위 사진처럼 [-1~1]의 범위를 가진다. --- Viewport Clip Space를 모니터에 표시하기 ...

220610) SRT Transform, 벡터, 내적과 외적

이미지
 SRT Transform 좌표계 내 객체의 크기(Scale), 각도(Rotation), 이동(Translation)의 변환을 도와주는 행렬을 뜻한다. 위 사진은 Homogeneous 2D 좌표계에서 변환을 할 경우의 변환행렬 계산식을 나타낸 것이며, 좌표 p = [x,y,1]이 있다고 할 때(p의 3번째 원소는 상수 w), [p' = (T · R · S) · p] 꼴로 표현하여 변환된 좌표 p'를 구한다. ----- 3D에서의 Transform 출처:  http://dolphin.ivyro.net/file/directx8.0/tutorial09.html 3차원 좌표계의 변환행렬은 4x4 꼴로 계산한다. 이때, 변환행렬에 대한 SRT행렬 곱셈순서는 DirectX와 OpenGL 사이에서 차이가 발생한다. DirectX는 왼손 좌표계를 사용하고(p · SRT), OpenGL은 오른손 좌표계(TRS · p)를 사용하기 때문이다.  둘은 서로 전치행렬이므로 변환에 대한 결과 값은 동일하다. DirectX 에서의 3차원 회전변환 행렬은 다음과 같다. (OpenGL의 경우는 위 행렬을 전치행렬로 바꾸면 된다) 벡터 : 방향과 크기를 나타낸 것. 앞 좌표가 원점이면 끝점값만으로 벡터를 표현할 수 있다. 벡터 합연산 : 두 벡터의 값을 합한 값. A+B일때 아래의 법칙 중 하나를 사용해 결과값 C를표현할 수 있다. 벡터의 실수배 : 벡터에 실수(스칼라)를 곱한 값. 스칼라는 방향 없이 크기만을 가진 값을 뜻하며, 벡터와 곱할 경우 크기에 영향을 준다. 벡터의 내적(Dot Product) : 벡터와 벡터를 곱했을 때, 스칼라값으로 변하는 곱. A · B 꼴 로 표현한다. : A = (a1,a2,a3), B = (b1,b2,b3)일 때, A · B = ( a1*b1 , a2*b2 , a3*b3 ) 로 계산된다. 벡터의 외적(Cross Product) : 벡터와 벡터를 곱했을 때, 벡터값을 유지하는 곱. A×B 꼴로 표현한다. : A = (a1,a2,a...

220608) Tree의 전위순회, 중위순회, 후위순회

이미지
Tree형 자료구조에는 노드가 가지처럼 뻗어있으며, 이들을 방문하는 방식이 여러가지가 있다. 최상위의 노드를 '루트'라고 부르고, 그 밑으로 뻗어 나있는 것들을 '서브트리'라고 한다. 또한 자신을 부모노드라고 칭할때, 그 밑으로 노드를 가졌다면 그 노드를 자식노드라고 부른다.  마지막으로, 자식노드가 없는 가장 마지막으로 뻗은 노드를 '리프'라고 부른다 ----- 전위순회 : 루트 노드를 시작으로 왼쪽->오른쪽순으로 서브트리를 방문하는 방식 ----- 중위순회  : 왼쪽 서브트리 -> 부모노드 -> 오른쪽 서브트리 순으로 방문하는 방식 ----- 후위순회 : 왼쪽 서브트리 -> 오른쪽 서브트리 -> 부모노드 순으로 방문하는 방식

220607) Lvalue, Rvalue, 복사생성자, 이동생성자, Rvalue Reference

이미지
Lvalue  : 메모리 주소를 포함하고 있는 값, 일반적으로 변수에 저장되어 표현식 계산 후에도 값을 유지한다. Rvalue  : 표현식 이후에는 사용되지 않는 일시적인 값, 일반적으로 계산이 종료되면 소멸한다. 복사생성자  : 기존 클래스의 데이터를 복사해서 생성하는 생성자.  : 깊은 복사(Deep Copy)를 통해 복사대상의 포인터 멤버변수 참조값마저도 복사해서 새 포인터에 붙여 넣는다는 특징이 있다.  : STL Vector의 push_back()이 복사생성자의 원리를 활용한다.  : Func(const Func& func) 꼴로 사용한다. 이동생성자  : 클래스의 데이터를 가져와서 생성하는 생성자. 복사생성자와 언뜻 비슷해 보이지만 매개변수 클래스가 가진 포인터 멤버변수의 참조소유권을 대상에게 넘긴다는 차이가 있다. 이동 후의 매개변수 클래스가 가지고 있던 포인터 멤버변수의 참조는 해제된다.  : 얕은 복사(Shallow copy)를 사용하기 때문에 메모리 부담이 적다.  : STL Vector의 emplace_back()이 이동생성자의 원리를 활용한다.  : Func(Func&& func) 꼴로 사용한다. Rvalue Reference  : 임시적인 값인 Rvalue값을 참조할 수 있게 하는 방법. Lvalue참조에 비해 리소스 이동에 따른 데이터 변질이 일어나지 않는다.  : 자료값 뒤에 &&를 붙여 표현한다. ( 예: int&& a; ) 또한 이동생성자의 매개변수로서 사용되기도 한다.  : 아래와 같이 Lvalue참조가 Lvalue만을 받을 수 있는 것처럼, Rvalue또한 Rvalue만을 받을 수 있다.

220603) 캐시 메모리, 바이트 패딩

캐시 메모리  : CPU가 필요한 데이터가 있을 때 가장 먼저 접근할 수 있는 캐시 메모리에서 찾는다. 캐시 메모리에서 원하는 정보를 얻으면 Cache Hit 라 부른다. Cache Hit 빈도가 높을수록 정보처리 성능이 높아진다.  : 캐시 메모리에서 원하는 데이터를 찾지 못하면  Cache Miss 라고 하여 이 경우 메모리 저장소에서 찾아 캐시 메모리에 업로드한다. 바이트 패딩  : 클래스/구조체에 바이트를 부여해 CPU의 부하를 덜어주는 기법이다. 부여되는 바이트는 현재 구조체/클래스가 가지는 용량(padding)이며 특정 분량만큼 확보한다. 이는 용량 낭비로 비쳐 보일 수 있으나, 한 번에 정해진 한 움큼 단위의 바이트를 확보함으로써 메모리-CPU 간의 이동 횟수를 줄이고 Cache Hit 비율을 높이기 위한 방법이기도 하다.

220602) cpu, 랜덤 엑세스, 메모리 구조, 배열, 연결리스트

이미지
 CPU  - 중앙 처리 장치(中央處理裝置) 또는 CPU(영어: central processing unit, central/main processor)는 컴퓨터 시스템을 통제하고 프로그램의 연산을 실행 · 처리하는 가장 핵심적인 컴퓨터의 제어 장치이다. CPU 중에서도 각종 전자부품과 반도체 칩을 하나의 작은 칩에 내장한 형태를 마이크로프로세서라고 한다. 액세스  - 순차접근(Sequential access): 첫 번째 값부터 원하는 값이 있는 위치까지 차례대로 접근하는 방식  - 임의접근(Random access): 정해진 주솟값을 통해 바로 접근하는 방식 메모리 구조  : 계층구조로는 레지스터, 캐시, 메모리, 하드디스크 등으로 나뉜다.  : 또는 메모리 내부에서는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉜다. 배열  : 같은 타입의 데이터를 여러 개로 나열한 자료구조, 배열 한 칸당 하나의 인덱스를 배정 받으며, 인덱스 번호를 통한 데이터 접근(임의 접근)이 가능하기 때문에 접근속도가 빠르지만, 칸 사이에 데이터를 삽입/제거하기 번거로운 단점이 있다. 링크드 리스트  : 첫 번째 인덱스부터 차례대로 접근하는 방법(순차 접근)을 사용하는 자료구조, 배열에 비해 검색이 느리다는 단점이 있지만 각 데이터를 잇는 포인터가 가리키는 주소의 수정이 용이하기 때문에 삽입/제거가 빠르다.