지역 변수 선언 위치에 대한 궁금증.
글쓴이: yann8166 / 작성시간: 수, 2014/11/26 - 1:52오후
cppcheck 검사 결과 variableScope 관련 워닝을 발견 하였습니다.
아래는 예시입니다.
int function() { int a = 0; for ( int i = 0; i < NUM; ++i ) { array[a] = num; a++; } }
이와 같은 상황에서 변수 a를 for문 속에서 선언하라고 결과가 나왔는데
매번 a의 메모리를 반복해서 할당 하는 연산이 int형 변수 하나를 함수가 죽기 전까지 잡아 두는 것보다 나은 방법인가요?
Forums:
효율성의 문제가 아니라 말 그대로 scope의
효율성의 문제가 아니라 말 그대로 scope의 문제입니다.
a가 for문 외부에서 사용할 일이 없으면 외부에서 선언할 필요가 없다는것이지요..
말씀하신 효율성 면으로 봤을때는 다른 문제가 됩니다.
{} 블럭내에서만 사용하는 변수라면 당연히 블럭내에서 선언해야하는것이고
블럭 내 작업 이후에도 해당 변수를 사용할일이 있다면 블럭 외부에서 선언하는게 당연한거 아니겠습니까?
간단하게 위 코드에서 for 블럭 이후에 단순히 a를
간단하게 위 코드에서 for 블럭 이후에 단순히 a를 출력하는 printf만 하나 더 있어도 해당 scopewarning은 나질 않을겁니다.
...
1. 일단 스택에 잡히는 로컬 변수니 heap에 메모리를 할당하는 일은 없습니다.
2. 요즘 컴파일러는 최적화를 잘 하기 때문에 "int a"가 for loop 안에 있든 밖에 있든, 그것 가지고 스택포인터를 계속 건드리지는 않습니다. 예시된 코드대로라면 십중팔구 아예 스택도 안 쓰고 레지스터를 사용할 가능성이 높습니다.
3. 그건 그렇다 치고, 저 코드에서 int i = 0을 for loop 안으로 집어넣어 버리면 동작이 달라질 텐데요? -_-
3.에 i가 아니라 a를 의미하신 듯 한데, 다음과
3.에 i가 아니라 a를 의미하신 듯 한데, 다음과 같이 사용하면 동작도 달라지지 않고 워닝이 뜨지 않을 것 같습니다.
댓글 달기