[C#] C++과의 사소한 차이점 모음(지속 업데이트_22.04.08)

RisingJade의 개발기록·2022년 3월 11일
0

C#이 C++과 다른 각종 사소해보이지만 사소하지 않는 것들


1. C#에서 상수 문자열 (ex. "Hello World!")에 끝부분에는 '\0'(널) 값이 들어가지 않는다...

  • 그래서 복사할때 기본제공같은거 안쓰고 C++처럼 생각해서 위의 "Hello World!"lenght 13까지 해버리면 안된다. string helloworld = "Hello World!"에서 helloworld[12]하면 C++에서는 \0(cout으로 찍으면 걍 공백으로 보일거임)이 뜨지만 C#에서는 인덱스 아웃 에러뜬다...

2. Struct에서의 NEW

이미 존재하는 인스턴스를 참조하지 않는이상 참조타입으로 선언된 변수를 사용하기 위해선 반드시 할당을 해야한다.

SampleClass SC = new SampleClass(100);

보통 이런식으로 new 를 통해 운영체제에 의해 공간을 할당받아 생성되는 인스턴스는 힙(Heap)영역에 올라가게 된다.

반대로 struct 타입으로 선언된 변수는 일반 변수처럼 선언하되, 멤버변수들을 초기화 하기만 하면 new 를 통한 할당없이도 사용할 수 있습니다. ( 일반 변수들과 사용하는 것이 비슷하다.)

//아래와 같이 사용할 경우 멤버를 모두 초기화해주기 전에는 사용할 수 없다. 상당히 귀찮다.
SampleStruct SS;
SS.a = 1;
SS.b = 2;
SS.c = 3;
SS.Test();

다만 struct를 쓰기에는 c++에 비해서는 불편한게 기본 생성자를 사용할 수 없고(무지성 선언 불가...) 선언 후 이를 사용할려면 멤버를 모두 초기화 해야하며 클래스로 부터의 상속을 사용할 수 없고(인터페이스는 가능) 불변성을 띄는경우가 있다 등등의 별의 별제약사항이 있다.

  • 그래서 new 키워드로 그냥 생성하는 경우가 생겼다...
//3가지 멤버를 한번에 초기화 해주는 생성자를 호출한다. 훠어얼씬 편함
SampleStruct SS = new SampleStruct(1,2,3);
  • 이때...! C/C++ 적인 관점에서 보면 new로 초기화를 했으니 힙영역에 있겠지?라고 생각하겠지만

    놀랍게도 MS공식 레퍼런스에 따르면 STACK영역에 있다.

  • 단! class 내부에 존재하는 struct는 당연히 클래스 동적할당시 올라가는 힙영역에 같이 올라간다.
class StructTest
    {
        int a;
        SampleStruct SS; //이부분이 스택에 올라가는건 아니다.
    }
main(){
	StructTest test1 = new StructTest(); //이런식으로 클래스가 동적할당으로 heap에 올라가면 SampleStruct도 같이 힙으로간다.
}
    

3. lock vs lock_guard

  • C#에는 lock이라는 아주 편한 thread-safe 함수가 있다. lock(object)를 쓴 뒤 {} 코드 블럭을 감싸주면 그 안에있는 변수나 함수, 실행에 대한 접근은 thread 하나만이 접근할 수 있고 처리하게 된다.
  • 그 lock과 비슷 한것이 lock_guard다 완전히 같다고 하기엔 좀 다른데. 아무튼 내부적으로 생성자로 lock을 걸었다가 현재 스택프레임이 끝나면서 소멸자가 작동되고 소멸자에 unlock이 호출되는 방식이니 비슷하긴 하다.
  • 사용법은
mutex m;
// 선언한 순간부터 lock이 걸린다.
{
  ...
  std::lock_guard<std::mutex> lockGuard(m);
  ...
}
// uniqueLock.lock()을 호출하기 전까지 lock 걸리는 것을 미룬다.
{
  std::unique_lock<std::mutex> uniqueLock(m, std::defer_lock);

  ...
  uniqueLock.lock()// 실제 락이 걸리는 위치
}
profile
언제나 감사하며 살자!

0개의 댓글