2015. 5. 16. 13:33


vector 메모리 보다가 정리함


3글자 단위로 메모리가 4바이트씩 더 할당되네 멀까.. 아아.. 그거인가 그 페이징할때 포인터니까 4바이트씩 할당하는건가

맞는듯 


char*형 메모리 하나는

[][][][]

요 크기고


[a][a][a][\n]

끝에 공백문자 들어가니까 네글자부터는 4바이트 초과하네 ㅇㅋㄷㅋ


'C/C++' 카테고리의 다른 글

상속, 가상함수, 가상함수테이블, 디버그  (0) 2015.05.03
Posted by 반얀
2015. 5. 8. 10:44

delegate의 callback사용 예

 

class Test : MonoBehaviour
{
    delegate T MyDelegate<T>(T a, T b);

    public int Plus(int a, int b) { return a + b; }
    public float Plus(float a, float b) { return a + b; }

    void Show<T>(T a, T b, MyDelegate<T> dele)
    {
        print(dele(a,b));
    }

    void Start()
    {
        MyDelegate<int> Plus_int = new MyDelegate<int>(Plus);
        MyDelegate<float> Plus_float = new MyDelegate<float>(Plus);

        Show(11, 11, Plus_int); //묵시적
        Show<int>(11, 11, Plus_int); //명시적
        Show(11.6f, 11.3f, Plus_float); //묵시적
        Show<float>(11.0f, 11.0f, Plus_float); //명시적
    }
}

 

Unity에서 작성한거라 모노상속되어있음

 

http://mrw0119.tistory.com/19

 

'C#/Unity' 카테고리의 다른 글

c# where  (0) 2015.05.29
GetComponentsInChildren overload  (0) 2015.05.28
arraylist list 차이  (0) 2015.05.06
Unity 원하는 객체(클래스)를 인스펙터창에서 만질수 있도록  (0) 2015.04.20
unity ugui sprite packer  (1) 2015.04.15
Posted by 반얀
2015. 5. 8. 09:30

흠.. effective C#에서는 foreach가 collection의 type에 구애 받지않아 좋다고하지만

 

유니티 프로파일러상에서 테스트결과는 for문이 더 빠르고 GC도 덜 발생함.

 

단, 한 loop에 iterate할 변수에 한번 접근할경우이고 한 loop에 여러번 접근하게 되면 foreach랑 차이가 없어짐.

 

 

http://www.dotnetperls.com/for-foreach

 

http://cafe.naver.com/unityhub.cafe?iframe_url=/ArticleRead.nhn%3Fclubid=26377973%26page=1%26inCafeSearch=true%26searchBy=0%26query=delegate%26includeAll=%26exclude=%26include=%26exact=%26searchdate=all%26media=0%26sortBy=date%26articleid=18538%26referrerAllArticles=true

'UnityOptimization' 카테고리의 다른 글

유니티 최적화  (0) 2015.04.01
Posted by 반얀
2015. 5. 6. 16:30

 

       c#                    c++

일단 List<>          == Vector<> 인듯

       LinkedList<> == List<>

 

아래 나와있는것처럼 ArrayList의 경우는 type제약 없이 받는대신 박싱/언박싱이 일어나 성능상 다운이 일어날 수 있지만

List<>의 경우는 type을 지정가능하니 가능하면 List를 사용하는 방향으로 나가야 할 듯.

 

http://www.hoons.net/Board/qacshap/Content/58016

arraylist 는 아이템타입이 object형입니다. 레퍼런스타입을 넣을때는 상관없지만 value타입을 넣는다면 box과 unbox이 일어나서 퍼포먼스가 좋지 않죠
그대신 List<T>는 type을 지정할수 있어서 box과 unbox이 일어나지 않아서 arraylist보다 퍼포먼스가 좋구요
사용자
xenon            [2013-03-27]
Level 54
 [EXP.48/250]
Lookvv 님이 설명하신부분에 추가하자면,
ArrayList는 타입을 지정하지 않기 때문에, 한개의 컬렉션에서 다양한 타입의 개체들을 담을때에는 상관 없지만, 대부분 한개의 컬렉션에서 한개의 타입들의 컬렉션을 유지한 상황에서는 컬렉션 값을 가져올때, 일일이 typecasting을 해줘야 하는 번거로움과, 캐스팅 한 개체가 넣을때 썼던 개체가 다를때에 컴파일 타임에서 오류를 발견할 수가 없습니다.

웬만하면, List<T>를 사용하시길 추천드립니다.

 

 

 

http://blog.powerumc.kr/21 c# 제너릭

 

 

http://kmj1107.tistory.com/entry/ASPNET-%EB%8B%B7%EB%84%B7-%EA%B8%B0%EC%88%A0-%EB%AC%B8%EC%A0%9C-Part1-C-%EC%96%B8%EC%96%B4-%EB%B6%80%EB%B6%84

'C#/Unity' 카테고리의 다른 글

GetComponentsInChildren overload  (0) 2015.05.28
delegate, callback  (0) 2015.05.08
Unity 원하는 객체(클래스)를 인스펙터창에서 만질수 있도록  (0) 2015.04.20
unity ugui sprite packer  (1) 2015.04.15
c# struct  (0) 2015.04.05
Posted by 반얀
2015. 5. 3. 22:58

가상함수는 상속관계에서 override한 함수를 사용할 때 선언한 포인터가 실제 가리키는 객체의 자료형을 기준으로 삼지 않고 포인터의 자료형을 기준으로 판단해 일어날 수 있는 문제를 해결하기 위한 방법.


간단한 예


class High

{

public:

void Show()

{

cout<<"high show"<<endl;

}

};


class Low : public High

{

public:

void Show()

{

cout<<"low show"<<endl;

}

};


void main()

{

High* ptrHigh = new High;

Low* ptrLow = new Low;

High* ptrWhat = new Low;


ptrHigh->Show(); //1행

ptrLow->Show(); //2행

ptrWhat->Show(); //3행

}


1행의 결과는 high show , 2행의 결과는 low show 일 것이다. 그렇다면 3행의 결과는? c++은 포인터의 자료형을 기준으로 판단하기 때문에 실제 포인터에 동적할당한 건 Low클래스 일지라도 포인터의 자료형인 High클래스의 Show 함수를 호출하게 된다.

여기서 실제 가리키는 대상의 함수를 호출하고싶다면 가상함수를 사용하면된다.


class High

{

public:

virtual void Show()

{

cout<<"high show"<<endl;

}

};


class Low : public High

{

public:

virtual void Show()

{

cout<<"low show"<<endl;

}

};


void main()

{

High* ptrHigh = new High;

Low* ptrLow = new Low;

High* ptrWhat = new Low;


ptrHigh->Show(); //1행

ptrLow->Show(); //2행

ptrWhat->Show(); //3행

}


클래스내에 virtual 키워드를 사용한, 즉 가상함수가 존재하면 가상함수 테이블에 해당 함수의 번지수를 가리키는 포인터가 저장된다.

그러면 이 경우에는 High클래스의 가상함수 테이블에 High::Show()의 번지수가 저장되고, Low클래스의 가상함수 테이블에는 Low::Show()의 번지수가 저장되어 원하는 함수를 호출할 수 있게 되는 것이다.


일반함수는 가상함수 테이블에 등록되지 않고 virtual 키워드를 붙인다면 오버라이드 하지 않더라도 가상함수 테이블에 등록된다. 

기본적으로 비주얼스튜디오에서는 최상위 부모클래스의 가상함수 테이블만 확인할 수 있다.


class High

{


public:

virtual void Func1()

{

cout << "high func1" << endl;

}


virtual void Func2()

{

cout << "high func2" << endl;

}


void FuncNo1()

{


}


virtual void FuncNo2()

{


}

};


class Middle : public High

{


public:

virtual void Func1()

{

cout << "middle func1" << endl;

}


virtual void Func3()

{

cout << "middle func3" << endl;

}

};


class Low : public Middle

{


public:

virtual void Func1()

{

cout << "low func1" << endl;

}


virtual void Func3()

{

cout << "low func3" << endl;

}


virtual void Func4()

{

cout << "low func4" << endl;

}

};


void main()

{

High* classHigh = new High;

Middle* classMiddle = new Middle;

Low* classLow = new Low;


classHigh->Func1();

void(**vt_high)() = *(void(***)())classHigh;

classMiddle->Func3();

void(**vt_middle)() = *(void(***)())classMiddle;

classLow->Func3();

void(**vt_low)() = *(void(***)())classLow;


cout << "gogo" << endl;

}


예를 들면 위의 코드의 기본 제공되는 조사식에서는 High클래스의 가상함수 테이블만 확인가능하다.

하지만 위처럼 void(**vt)() = *(void(***)())&object; 라는 코드를 입력하면 조사식에서 클래스별로 확인가능하다.

vt의 위치에는 조사식에서 사용할 이름, &object는 조사를 원하는 객체명을 넣어주면 된다.

그리고 조사식에 vt,n의 형식으로 입력하면 &object의 가상함수 테이블 항목을 n개까지 확인가능하다.


아래의 그림이 위의 코드를 삽입하고 조사식으로 가상함수 테이블을 확인해본 결과이다

테이블의 크기보다 크게 조사범위를 입력하면 음.. 쓰래기값인지 무슨 의미인지 모르는 결과도 출력이 되는데

아무튼 아래의 조사식을 통해서 각각의 클래스가 예상한 바대로 가상함수 테이블을 형성했다는것을 알수 있다.


아래의 메모리는 Middle클래스의 가상함수 테이블의 주소인 0x0112dca0을 찾아가본 것인데 

위의 조사식에서 보다시피 가상함수 테이블에 들어있는 함수주소들인

0x011212f3, 0x0112151e, 0x01121523, 0x0112150a가 차례로 저장되어 있는 것을 알 수 있다.

아래 메모리에서 주소들이 거꾸로 써져있는 것은 리틀엔디언 때문이다.




'C/C++' 카테고리의 다른 글

char* 메모리  (0) 2015.05.16
Posted by 반얀