코딩 55일차 C/C++

마스터피스·2023년 12월 6일
0

C/ C++ 

목록 보기
27/35
post-thumbnail

프로그램의 실행 구조 / Bitwise / 순수 가상함수

1) Bitwise 연산

ex) 예제

#include <cstdio>

int main() {

    // Bitwise or
    // Bitsise and
    // Shift << , >> 비트를 왼쪽 오른쪽으로 이동시키는것

    int v1 = 1; // 0001
    int v2 = 3; // 0011

    int bitwise_or = v1 | v2;
    printf("bitwise_or: %d\n", bitwise_or);
    // 01 10 2진수를 구했기 때문에 11이 돼서 3이 된다


    int bitwise_and = v1 & v2;
    printf("bitwise_and: %d\n", bitwise_and);
    // and 연산은 01 이 나온다 겹치는게 마지막 1 하나있기 때문

    int shift_left = v2 << 1; // 0110
    printf("shift_left: %d\n", shift_left);

    int shift_right = v2 >> v1; // 0001
    printf("shift_right: %d\n", shift_right);


    return 0;
}

-Bitwise 연산은 비트를 기준으로 논리연산을 진행하는 것을 Bitwise 연산이라고 합니다.비트와이즈 연산은 컴퓨터에서 가장 빠른 속도로 실행되기 때문에 이를 유용하게 활용하게 되면 재미있는 코드를 만들어낼 수 있고 성능도 잡을 수 있습니다.이를 이용한 대표적인 알고리즘이 게임에서 카테고리별 충돌 체크 알고리즘입니다. 카테고리를 나눠서 적당한 위치에 integer변수를 두고 이 integer변수를 bitwise and 연산하는 것만으로 충돌이 될 대상인지 아닌지를 바로 판단할 수 있어 조건문을 줄일 수 있고 성능 향상을 노릴 수 있습니다.

2) 순수 가상함수

예제)

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>

enum class Time {
    Mornig, Afternoon, Night
};

class Animal {
public:
    char name[100];
    Animal(const char* name) {
        strcpy(this->name, name);

    }

    // 순수 가상함수 만드는 방법
    virtual int getLegs() = 0;

    void printInfo() {
        printf("이름: %s / 다리: %d\n", name, getLegs());
    }
};

class Person : public Animal {
private: 
    Time time = Time::Mornig;
public:
    Person(const char* name) : Animal(name) {}

    virtual int getLegs() {
        switch (time) {
        case Time::Mornig: return 4;
        case Time::Afternoon: return 2;
        case Time::Night: return 3;
        }
        return 2;
    }

    void setTime(Time t) {
        this->time = t;
    }
};

class Dog : public Animal {
public : 
    Dog() : Animal("개"){}

    virtual int getLegs() {
        return 4;
    }
};

int main() {

    Person* p = new Person("영희");
    p->setTime(Time::Afternoon);
    p->printInfo();

    Dog* d = new Dog();
    d->printInfo();


    return 0;
}
  • 순수 가상함수는 몸체가 없는 가상함수입니다. 개발자들은 나중에 할 일은 최대한 나중에 하려는 습성이 있습니다. 이 가상함수의 구현을 자식 클래스의 동작으로 미뤄놓는 형태로 이를 활용하면 더욱더 유기적인 클래스 동작 구성이 가능해집니다.

3) 프로그램의 실행 구조

  • 여러분이 만든 프로그램은 실행될 때 램 메모리에 적재되어 실행되게 됩니다.물론 아닐 수도 있지만 대부분의 경우는 그렇습니다.이 경우에 stack 영역과 heap 영역이 있는데 각각의 영역은 프로그램에서 사용되는 값들을 저장하는 공간으로 활용됩니다. 이 stack 영역괴 heap 영역에서 특별히 알아둬야 할 것은 함수 call stack 입니다. 왜 함수가 종료되면 함수 내부의 변수가 사라지는지 알아둬야 합니다.

*더 알아보기

함수라는 것은 이와 같이 call stack을 통해 값이 복사가되고 관리가 되기 때문에함수 호출에는 필수적으로 함수 호출 비용 이라는 것이 발생하게 됩니다.이 함수 호출 비용이라는 것은 '메모리적인 문제' 혹은 '연산 속도적인 문제' 둘 다에 해당합니다.

profile
코딩 일지

0개의 댓글