ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 기술 면접 책 정리(비트조작, 일반 C++관련)
    @ 16. 1 ~ 17. 1/면접관련 2016. 12. 15. 19:08

    양수를 음수로 바꾸는 이진 표기법은..

    우선 양수상태에서 1. 모든 비트를 뒤집고.. 2. 1을 더한다 그러면..바로 음수가 된다.


    2의 보수 표기법에서 첫번쨰 비트는 부호비트이다.0이면 양수 1이면 음수




    union으로 선언하게 되면 메모리상에 위와 같이 잡힌다.

    특징으로는 시작주소가 같은 값으로 시작되게 된다.

    그렇게 때문에 union의 값으로 값을 기록하고 다시 쓰면 이전 값을 당연히 지워진다. 메모리의 시작 위치가 같기 때문이다.

    union형의 내부적으로 많은 변수 선언이 이루어져 있어도 결국 사용되는 메모리는 하나이다.

    유니온을 결국 이런식이여서 가장 큰 Type을 총 메모리 크기로 잡아 준다. 그래서 sizeof하면 가장 큰 값이 그 크기로 나옴..!!


    이걸로 빅엔디안 리틀 엔디안 확인할 수 있음..

    bool isLittleEndian()

    {

    union

    {

    int a;

    char singlebyte;

    }endianTest;


    endianTest.a = 1;


    return endianTest.singlebyte;

    }


    *유니온으로 메모리를 같게 쓰는데 과연 1이라는걸 int에 넣었을때 

    작은 메모리 주소부터 빅엔디안이라면 최상위 바이트가 들어갈테고, 리틀이라면 최하위 바이트가 들어갈테니..

    메모리를 공유하는 입장에서 int = 1 이라는건 특히 리틀엔디안이라면 낮은 메모리주소에 최하위 바이트가 들어갔을테고..

    그걸 char형이 같이 메모리를 공유하니까 확인해보면?(최하위 메모리를 확인하는거임..) 1이 나온다.

    그래서 내컴퓨터는 리틀엔디안임..




    int numOnesInBinary(int number)

    {
        int numOnes = 0;

        while(number != 0)

    {

    if((number & 1) == 1)

    {

    numOnes++;

    }

    number = number >> 1;

    }

    return numOnes;

    }

    이런식으로 특정한 수의 비트가 1인게 몇개인지 알 수 있음..

    해당 수의 비트를 오른쪽으로 쉬프트 연산하면서 끝자리를 비트 연산해보는거임..결국 그 수는 0에 가까워 질테고 0이면 끝난다.



    가상메모리 설명 굿 http://cappleblog.co.kr/247



    프랜드 클래스

    이 키워드를 사용하면 그 선언이 이루어진 클래스에 있는 비공개 멤버에 대한 프렌드 함수 또는 프렌드 클래스를 액세스를 허용할 수 있다.

    이렇게 하면 어떤 클래스에서 다른 클래스의 비공개 멤버를 건드릴 수 있기 때문에 객체지향 프로그래밍의 원칙이 위배된다고 생각하는 프로그래머들도 많다. 

    근데 진짜 써야 할상황이 있다 언제냐면..


    복잡한 동적 배열 클래스를 구현했다고 하자. 배열에 대한 반복자를 ㅂ별도의 클래스로 만들고 싶은 경우가 있다.

    이 반복자 클래스에서는 동적 배열 클래스의 비공개 멤버를 액세스할 수 있어야 제대로 작동할 수도 있다.

    이런 경우에는 반복자를 배열 클래스의 프랜드 클래스로 선언하면 된다.

    그 두 클래스는 서로 땔래야 땔 수 없는 관계이므로 굳이 그 둘을 깔끔하게 분리할 필요가 없다면 말이다.

    음...중첩클래스를 써서 만들어도 될듯한데..


    매크로와 인라인 함수..

    매크로는 단순히 전처리기에 의한 텍스트 치환 방식으로 구현된다.

    굳이 함수 호출에 필요한 오버헤드를 부담하기에는 너무 단순한 코드가 있을때 매크로를 많이 쓴다.


    매크로 단점

    컴파일러의 전처리기 지원

    전처리기를 사용한 코드는 디버깅하기 어려운 것이 사실이다그 이유는 컴파일러 전단계에서 동작하므로 컴파일러를 통한 아무런 경고나 에러 메세지를 받을 수 없고 디버깅시 코드를 따라가면서 코드의 흐름을 보기에 불편하기 때문이다


    최신 컴파일러의 경우 잘못된 매크로에 대한 경고 메세지를 보여주거나 매크로를 인라인 함수로 대체하는 식의 선 처리작업과 함께 다양한 디버깅 지원을 해주어 개발자의 커다란 불편함이 조금은 줄어들고 있다.


    인라인 함수는 일반 함수와 거의 비슷하게 선언하고 정의되는데..매크로와는 달리 컴파일러가 직접 처리한다.


    근데 둘다 함수호출에 대한 오버해드를 줄이는 대신에 프로그램 크기가 커지는것을 감수해야한다는 공통점이 있다.

    알지? 인라인 함수나 매트로의 경우 그 바디가 와서 교체되는거니까..




    32비트와 64비틑 애플리케이션에서 쓸 수 있는 메모리 주소와 일반 레지스터의 크기를 나타낸다.

    가장 큰 차이는 메모리 주소임..

    32비트는 4기가 바이트의 메모리 제한

    64비트는 16엑사바이트???

    그래서 더 많은 데이터를 메모리에 올려놓고 느린 디스크 접근을 줄일 수 있는 64비트 애플리케이션이 더 빠를 수 있다.

    단 64비트에서는 모든 포인터를 저장할떄 메모리가 두배 필요하다. 포인터(또는 배후에서 포인터를 사용하는 레퍼런스)를 사용하는 자료구조의 경우

    똑같은 자료구조를 써도 64비트 애플리ㅔ이션에서는 32비트 애플리케ㅣ션에 비해 메모리가 두 배 필요하다.

    음 그리고..중요한건 프로세서 캐시 크기가 둘다 똑같다..64비트 자료구조는 더 용량으 ㄹ많이 차지해서 캐시에 조금밖에 못 넣는다. 

    캐시 미스가 발생활 확률이 높지..그런데!! 그런데!!! 64비트 아키텍처의 프로세스라면!

    레지스터가 8개 이상 추가되어서 ㅋㅋ 큰 문제 없음.. 성능이 더 좋아짐

    그래서 64비트 아키텍처 안에서라면 32비트보다 항상 빠름 ㅋㅋ 근데 이건 아키텍처의 힘이고 단순히 32비트 64비트 애플리케이션 사이의 장단점 문제와는 별개다




    해시 테이블과 이진 검색 트리를 비교 장단점..


Designed by Tistory.