하지만 최적화의 경우에는 다르다. 조금이라도 빠른 코드를 위해서라면 무슨짓이든 할 각오가 되어있는 상태라면 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;
}
}
짧을 뿐더러 훨씬 깔끔하고 이해하기 쉽다(나만 그런가).