ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...24
    일지 2022. 7. 14. 08:51

    변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자

    변수 사용 비용과 문제가 되는 부분

    객체는 생성될 때와 범위를 벗어나 소멸될 때 각각 생성자와 소멸자를 호출하는 비용이 고정적으로 발생한다.

    따라서 다음과 같은 경우에는 사용하지도 않을 객체의 생성, 소멸 비용을 지불하고 있게 된다.


    std::string encryptPassword(const std::string& password){    using namespace std;

        string encrypted;

     

        // encrypted를 사용하기도 전에 함수를 벗어날 가능성이 존재한다.    if (password.length() < MinimumPasswordLength) {        throw logic_error("Pssword is too short");    }

     

        return encrypted;}


     

    변수를 옮기더라도 실제 값을 초기화하는 부분이 따로 존재한다면 효율이 떨어지게 된다.

    따라서 변수의 위치는 실제 사용되는 부분과 값을 초기화해주는 위치를 모두 고려해야 한다.

     

    위의 코드는 다음과 같이 수정할 수 있을 것이다.


    std::string encryptPassword(const std::string& password)

    {

        using namespace std;

     

        if (password.length() < MinimumPasswordLength) {

            throw logic_error("Pssword is too short");

        }

     

        string encrypted(password);

     

        return encrypted;

    }


     

    반복문에서의 변수 초기화

    반복문에서 변수를 사용할 때는 다음 두 가지 방법을 고민할 수 있고 각각의 비용은 다음과 같다.

    • 루프 바깥에서 변수를 정의하고 내부에서는 사용만 하는 방법 생성자 1번 + 소멸자 1 번 + 대입 n번
    • 루프 내부에 변수를 정의하고 사용하는 방법 생성자 n번 + 소멸자 n번

     

    두 방법 중 비용이 더 적게 들어가는 것을 파악해서 사용하면 된다.

     

    개인적으로는 반복문 내부에서만 사용하는 변수의 경우 for문의 정의문 쪽에 정의해서 사용하는 것을 선호한다.


    // 이렇게 사용하면 for문 범위에서만 변수가 유효하다는 것을 보장할 수 있다.

    for (int i = 0, w = 0; i < 10; i++)

    {

        w += i;

    }


     

    댓글

Designed by Tistory.