"Hello World!"
를 lenght
13까지 해버리면 안된다. string helloworld = "Hello World!"
에서 helloworld[12]
하면 C++에서는 \0
(cout으로 찍으면 걍 공백으로 보일거임)이 뜨지만 C#에서는 인덱스 아웃 에러뜬다...이미 존재하는 인스턴스를 참조하지 않는이상 참조타입으로 선언된 변수를 사용하기 위해선 반드시 할당을 해야한다.
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
로 초기화를 했으니 힙영역에 있겠지?라고 생각하겠지만
class StructTest
{
int a;
SampleStruct SS; //이부분이 스택에 올라가는건 아니다.
}
main(){
StructTest test1 = new StructTest(); //이런식으로 클래스가 동적할당으로 heap에 올라가면 SampleStruct도 같이 힙으로간다.
}
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()// 실제 락이 걸리는 위치
}