[Code Review] 1. 임시 변수 정의는 꼭 필요할 때만

패치를 작성하면서 그 동안 리뷰어들에게 배운 올바르게 코드를 작성하는 방법을 정리해보려고 한다. 잘만 정리하면 같은 실수를 반복하지 않고 빠르게 패치도 반영하는데 도움이 될 것이다. 자, 그럼, 첫번째 규칙을 소개한다.

  1. 임시 변수 정의는 꼭 필요할 때만 하자.

코딩할 때는 가능한 코드를 간결하게 작성해야 한다. 아래와 같은 코드를 보자.

void DesktopWindowTreeHostX11::DispatchKeyEvent(ui::KeyEvent* event) {
  views::Widget* widget = native_widget_delegate_->AsWidget();
  if (widget->IsActive())
    GetInputMethod()->DispatchKeyEvent(event);
 }

widget 변수는 한번만 사용하므로 위와 같이 정의하고 초기화할 필요는 없다. 아래와 같이 한줄로 처리하면 좋다.

void DesktopWindowTreeHostX11::DispatchKeyEvent(ui::KeyEvent* event) {
  if (native_widget_delegate_->AsWidget()->IsActive())
    GetInputMethod()->DispatchKeyEvent(event);
}

임시 변수를 메모리에 할당하고 값을 쓰고 읽는데는 많은 어셈블리 코드가 필요하다. 이를 줄였고(컴퍼일러가 코드를 최적화하므로 별 차이는 없다) 코드도 좀 더 보기 편하고 깔끔해졌다.

물론, 아래와 같은 경우에는 임시 변수를 만드는 것이 좋다. (원문에서 예제 가져옴)

typedef struct { int x, y, z; } Point3;
typedef struct { Point3 *pos, *direction; } Object;
 
void InitPos1(Object *p)
{
   p->pos->x = 0;
   p->pos->y = 0;
   p->pos->z = 0;
}

위 코드와 같이 포인터 체인(pointer chain)을 이용하면 매번 p->pos를 다시 로딩해야 하므로, 아래와 같이 지역 변수를 만들어 포인터를 캐쉬하면 더 효율적이다.

void InitPos2(Object *p)
{ 
   Point3 *pos = p->pos;
   pos->x = 0; 
   pos->y = 0;
   pos->z = 0;
}

참고: Writing Efficient C and C Code Optimization

2 thoughts on “[Code Review] 1. 임시 변수 정의는 꼭 필요할 때만”

  1. ‘임시 변수를 메모리에 할당하고 값을 쓰고 읽는데는 많은 어셈블리 코드가 필요하다. ‘

    이건 사실이 아닐 것 같은데요? -O0 등으로 컴파일러 최적화 옵션을 꺼버리거나 volatile 등을 사용해서 강제로 최적화 하지 말라고 선언해둔게 아니라면 임시변수를 사용한 구현이나 위 코드 상에 있는 것 같은 포인터 체인 구현이나 결과물이 달라야 할 이유는 없습니다.

Leave a reply to joone Cancel reply