C# 28

(C# 7.2) Span<T>

이게 뭐고 왜 쓰나 Provides a type-safe and memory-safe representation of a contiguous region of arbitrary memory. 마이크로소프트 Docs에서 정의하는 Span의 기능이다. 사실 저게 뭔 말인가 싶지만 '배열에 대한 참조 뷰(View)를 제공하는 타입' 이라고 생각하면 된다. 그렇다 DB에서 자주 쓰이는 그 view이다. 그렇다면 이걸 왜 쓰는가? 힙 메모리 할당을 줄이기 위해 사용한다. Span 는 readonly ref struct이다. ref struct는 오로지 스택에만 생성이 가능한 구조체이다. 사용 예 1. 배열에 대한 View를 제공 { var arr = new int[] { 0, 1, 2, 3 }; var left ..

언어/C# 2022.08.07

단순동기화3 - 커널 모드 동기화

2022.05.06 - [언어/C#] - 단순동기화2 (유저 모드 동기화 요소) 커널 모드 동기화 요소 커널 모드 동기화 요소는 유저 모드 동기화 요소에 비해서 상당히 느리다. 왜냐? 커널 모드 동기화 요소가 운영체제에게 스레드 간의 동기화를 요청해서 그렇다. 또한 각각의 메서드들은 커널 객체를 이용하게 되고 이로 인해 스레드가 관리 코드 -> 네이티브 유저 모드 -> 네이티브 커널 모드 (돌아올 때도 역순으로 반복함) 위와 같은 전환을 일으켜 CPU 시간을 엄청나게 소비하기 때문이기도 하다. 그래도 커널 모드 동기화 요소를 쓰는 이유가 있다. 리소스에 대한 경쟁 상태를 확인할 수 있다. 스레드가 CPU를 낭비하지 않도록 한다. 네이티브 스레드와 관리 스레드 사이에서도 동기화를 할 수 있다. 동일 컴퓨터..

언어/C# 2022.05.09

C# - 리플렉션 (Reflection)

리플렉션 리플렉션은 컴파일 시에 알 수 없었던 타입이나 멤버들을 찾아내고 사용할 수 있게 해주는 메커니즘이다. 그러나 다음의 주요한 단점이 존재한다. 리플렉션을 사용하면 컴파일 시에 타입 안정성을 해친다. 리플렉션은 전반적으로 느리다. 어셈블리에서 정의하는 메타데이터를 살필 때 항상 문자열 검색이 수행되어야 한다. 리플렉션을 이용하여 멤버를 호출하면 성능에 좋지 않은 영향을 미친다. 따라서 먼저 매개변수들을 배열로 포장해야 한다. 내부적으로는 이렇게 포장된 내용을 다시 꺼내어 스레드의 스택에 옮긴다. 추가적으로 CLR이 메서드 호출 전에 각각의 매개변수들이 올바른 타입을 가지고 있는지 확인하고 호출자가 호출하려는 멤버에 접근할 보한 권한이 있는지 확인해야 한다. 상기의 이유로, 타입의 필드나 메서드 혹은..

언어/C# 2021.07.04

Unity에서의 Null Comparison

Comparison to 'null' is expensive Rider 에디터에서 유니티 오브젝트의 Null 비교 '=='연산자를 통해 수행하려 하면 다음과 같은 안내가 나온다. 단순히 null을 비교하는데 왜 이런 안내가 뜰까?? 이유는 UnityEngine.Object가 비교 연산자를 오버라이드 했기 때문이다. UnityEngine.Object의 비교 연산자는 lhs나 rhs중 둘 중 하나만 null일 때, 나머지 하나가 '살아있는' 오브젝트인지 검사한다. 이 과정은 나름 시간이 소요되기에 라이더에서 저런 안내를 해주는 것이다. 그러면 UnityEngine.Object가 살아있음을 보장할 수 있다면 null비교를 더 빠르게 수행할 수 있지 않을까? 여러 방법이 있겠지만 대충 세 가지 방법을 생각해 볼..

C# - 관리 힙과 GC (2)

네이티브 리소스의 처리 네이티브 리소스 네이티브 리소스란 파일이나 커널 객체 같은 걸 말한다. 대부분의 타입들은 메모리만을 이용하지만 네이티브 리소스를 사용하는 애들(파일 핸들, 소켓) 같은 애들은 그렇지 않다. 이런 경우에 GC가 네이티브 리소스를 감싸고 있는 타입을 수거해 간다면 네이티브 리소스에 대한 누수가 발생하게 된다!! GC는 네이티브 리소스에 대해 알지 못하기 때문에 이에 대한 처리가 필요해 보인다. Finalization 파일, 네트워크 연결, 소켓, 뮤텍스 같은 네이티브 리소스를 감싸고 있는 타입은 finalization이란걸 지원한다. CLR은 GC가 이런 객체를 가비지 수집하는 과정에서 Finalize 라는 메서드를 호출하여 객체가 감싸는 네이티브 리소스를 정리할 기회를 준다. pub..

언어/C# 2021.04.03

C# - 관리 힙과 GC (1)

관리 힙 C#은 왜 관리 힙을 쓰나? 메모리 관리를 수동으로 해줘야 하는 C++의 경우 메모리 해제를 까먹어 메모리 누수가 발생하거나, 이미 해제한 메모리에 접근하여 메모리 손상이 발생하는 경우가 많고 이는 결국 버그나 보안 취약점으로 연결된다. 리소스 할당 CLR환경 하에서는 모든 객체가 관리 힙에 할당된다. 프로세스가 초기화되면, CLR은 관리 힙으로 쓸 주소 공간을 할당하고 다음 객체를 할당할 위치를 가리키는 포인터(이하 NextObjPtr)을 시작 주소를 가리키게 한다. 이 주소 영역이 가득 차면 CLR은 프로세스의 주소 공간이 사용될 때 까지 영역을 확대한다. new연산자 CLR에서 new연산자는, 필요한 용량을 계산한다. (특정 타입의 필드, 상속한 타입의 필드까지) - 여기에는 type ob..

언어/C# 2021.03.28

C# Nullable, Null 결합 연산자

Nullable CLR의 값 타입은 null을 가질 수 없다. 그러나 여러 이유로 값 타입이 null을 가져야 할 때가 있다. 이에 대비하기 위해 CLR은 null을 허용하는 값 타입을 지원한다. FCL에는 System.Nullable 구조체가 정의되어 있다. (여러 이유 : 데이터베이스에서는 32비트 정수 값이 null을 가질 수 있음, Java의 Date클래스는 참조 타입이어서 null을 가질 수 있음 그러나 C#은 그렇지 않음... 등) Nullable에서 T는 구조체여야 하며 Nullable에는 여기에 현재 값을 가지고 있는지에대한 Boolean필드 정도만 추가한 값 타입이다. int? 는 Nullable와 같은 의미이다. Nullable의 박싱/ 언박싱 Nullable 타입은 값 타입이기에 박싱..

언어/C# 2021.03.06

C# 사용자 정의 특성

이전 글 tsyang.tistory.com/3 Attribute 0. 개요 애트리뷰트(attribute)는 다양한 요소(클래스, 메서드, 필드... 등)에 메타데이터를 추가할 수 있게 해 준다. 1. 필요성 두 가지 팝업 창이 존재한다. 한 가지는 자주 팝업 되고(ex. 이벤트 창) tsyang.tistory.com 이 글에서는 좀더 자세히 작성 사용자 정의 특성의 사용 일반 사용자 정의 특성은 단순히 특정 대상에 대해 추가적인 정보를 부가한다. 구체적으로도 컴파일러가 관리 모듈의 메타데이터상에 추가 정보를 기입하는 것에 불과하다. 또한 사용자 정의 특성은 단순히 특정 타입의 인스턴스이다. 모든 사용자 정의 특성은 직 간접적으로 모두 public 추상 클래스인 System.Attribute 클래스로부터 ..

언어/C# 2021.02.28

C# - 델리게이트

.NET Framwork는 콜백 함수 메커니즘을 델리게이트라는 형태로 노출한다. 델리게이트는 타입 안정성을 보장함으로써 C++등 다른 언어의 콜백 메커니즘은 다르게 더 강력한 기능을 제안한다. (그만큼 성능은 떨어질수도) 델리게이트 네이티브 C/C++에서 비멤버 함수의 주소는 단지 메모리 주소일 뿐이다. 이 주소는 다른 정보(매개변수, 반환 타입, 호출 규칙 등)를 일절 포함하지 않는다. 결국 타입 안정성이 없다. (대신 가볍고 빠르게 동작한다.) .NET Framework는 델리게이트라는 타입 안정성을 준수하는 메커니즘을 제공한다. 델리게이트 정의 delegate void SomeDel(int value); public class Program { public static void Main() { St..

언어/C# 2021.02.21