GOTO 문을 써도 되는 경우 예제

보통 goto 문은 쓰면 안 된다고들 한다. 책에서도 그렇고 얼핏 생각해서는 맞는 말 같다.

하지만 최적화의 경우에는 다르다. 조금이라도 빠른 코드를 위해서라면 무슨짓이든 할 각오가 되어있는 상태라면 goto면 어떻고 예외를 이용한 트릭이면 또 어떠한가? 이것들이 이해하기 어려운 코드를 만들어낸다고 해도 속도가 짱인 경우라면 goto정도는 귀엽게 봐줄 수 있다. 다음과 같은 예에서 보면 goto를 쓰면 간단한 코드가 goto를 쓰지 않으려면 while 문에 bool flag등 여러가지 장치를 사용해야 한다.



bool step_ahead(false);
do
{
 step_ahead = false;
 const OctreeManager::LeafItem& list = octree_manager_.At(current_position);
 for(int i=0; i
 {
  int node1, node2, node3, node4;
  node1 = elements_[list[i]].v[0]-1;
  // bla bla bla
  vec3 r;
  bool point_in_tetrahedra = PointInTetrahdra(v1, v2, v3, v4, current_position, d1, d2, d3, d4, r);

  if(point_in_tetrahedra)
  {
   current_position = current_position + r * 0.1;
   step_ahead = true;
   break;
  }
 }
}
while(step_ahead);



배열을 순회하면서 조건에 맞는 경우에는 다음 리스트를 불러오고 그렇지 않다면 끝내는 간단한 코드이다. do/while 안에서 stemp_ahead flag를 계속해서 검사하고 set하고 이런짓을 해야 한다. goto를 사용하면






FFF:
const OctreeManager::LeafItem& list = octree_manager_.At(current_position);
for(int i=0; i

{
int node1, node2, node3, node4;
node1 = elements_[list[i]].v[0]-1;
// bla bla bla
vec3 r;
bool found = PointInTetrahdra(v1, v2, v3, v4, current_position, d1, d2, d3, d4, r);
if(found)
{
current_position = current_position + r * 0.1;
goto FFF;
}
}
짧을 뿐더러 훨씬 깔끔하고 이해하기 쉽다(나만 그런가).