07.18

신승빈·2022년 7월 18일
0

KGCA 수업

목록 보기
9/128

GCC와 MSVC의 차이

int main()
{
    const int* pData = nullptr;
    int num[2] = { 4, 5 };
    pData = num;
    cout << &pData << endl << num << endl;
};
GCC
0x7ffcba93bc28
0x7ffcba93bc20

MSVC

GCC의 경우 연속적인 메모리 배치를 보여주지만, MSVC는 연속적이지 않음을 볼 수 있음.

찾아보니 stack에 지역변수를 할당할 때 메모리 배치 방법은 정의되어 있지 않음.
컴파일러에 따라 가장 최적화된 방식이라고 생각하는 형태로 메모리를 배치.

참고 : https://kldp.org/node/157621

참고 : https://stackoverflow.com/questions/25442458/why-are-consecutive-int-data-type-variables-located-at-12-bytes-offset-in-visual

const에 대하여

initializer list

class Test
{
	const int _val = 1;
    public:
    Test(int val) : _val(val) { }
};
int main()
{
	Test t(10);//t_val = 10;
}

class 정의에 값을 미리 넣는 것은 initializer list에 값을 대입한 것과 동일한 효과.

const 함수

class TestClass
{
    public:
    int a;
};

class Test
{
    public:
    int _val = 1;
    mutable int _mVal = 1;
    TestClass* p;

    public:
    Test()
    {
        p = new TestClass;
    }
    void func() const
    {
        int t = 1;
        
        _val = 10;			//access read-only memory
        _mVal = 10;
        t = 10;

        p->a = 10;
        p = new TestClass;	//access read-only memory
    }
};

const 함수는 멤버 변수의 변화를 불허.
단, 지역 변수는 상관 없음.
mutable 키워드 시 수정 가능.
포인터의 경우 포인터만 변경 불가.
포인터 내부 값은 변경 가능.

const와 Reference(&)

class Test
{
    private:
    int a = 0;

    public:
    int& func() { return a; }
};

int main()
{
    Test t;
    int& b = t.func();
    b = 10;
    cout << t.func();//10
    return 0;
}

위와 같은 방식으로 수행 가능.

const int& func();
int b = t.func();

할당 불가.

const int func();
int b = t.func();

수행 가능.

class TestClass
{
public:
int a = 0;
};

class Test
{
    private:
    int a = 0;

    public:
    const TestClass func() { return TestClass(); }
};

int main()
{
    Test t;
    TestClass tc = t.func();
    tc.a = 10;
    return 0;
}

수행 가능.

const_cast

const_cast를 통해 상수성을 지울 수 있음.

참고 : https://blockdmask.tistory.com/240

non-const한 변수에 const-pointer로 접근한 상황에서 pointing값을 변경하고 싶을 때 사용.

참고 : https://clucle.tistory.com/14

연산자 재정의

override키워드 필요 없음.

단항연산자

opeartor++() : 전위 연산자
operator++(int) : 후위 연산자, int만 가능.

operator+, operator+=

operator+ 는 RValue 반환형.
operator+=는 Reference 반환형.

class Test
{
    public:
    Test& operator<<(int a) { cout << a << endl; return *this; }
};

int main()
{
    Test t;
    t << 1 << 2 << 3;
    //1
    //2
    //3
    return 0;
}

왼쪽부터 수행되는 것을 확인 할 수 있음.

#include <iostream>

using namespace std;

class Test
{
    public:
    Test& operator+(int a) { cout << "Plus" << a << endl; return *this; }
    Test& operator*(int a) { cout << "Multi" << a << endl; return *this; }
};

int main()
{
    Test t;
    t + 3 * 2;
    return 0;
}
output : Plus6

operator 연산자의 우선순위는 유지됨.
위의 경우 3 * 2가 먼저 수행되어 t + 6으로 변형됨.

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글