2009-07-15 9 views
2

왜냐하면 obj, playingCard 객체가 중첩 된 for 루프 안에 만들어지기 때문에 두 번째 for 루프가 완료된 후 obj가 매번 스택에서 할당이 해제됩니다.중첩 루프 질문에서 변수 할당

작은 질문 인 컴파일러는 루프와 중첩 루프를 추적하기 위해 스택을 사용합니다 (재귀와 유사)?

 

for(int c = 0;c<nElems;c++) { for(int z = c + 1;z<nElems;z++) { playingCard obj; } }

답변

5

매 반복마다 생성되고 해체됩니다.

그러나 스택에서 할당 개념은 (적어도 VS 및 GCC의 경우) 더 흐릿합니다. 스택은 컴파일러에 의해 미리 관리되는 연속적인 메모리 블록이기 때문에 힙 할당 (new/delete 또는 malloc/free)에 대한 방식으로 할당 및 할당 해제에 대한 실제 개념은 없습니다. 컴파일러는 스택에 필요한 메모리를 사용하고 나중에 포인터를 롤백합니다.

+0

+1 스택에 할당/해제가 까다로운 이유에 대해 이야기합니다. 일반적으로 스택 포인터 위의 메모리 영역이 할당되고 그 아래의 메모리는 할당되지 않았다고 (분명히 예외가 있습니다 :)). – Falaina

2

내부 루프 반복마다 할당/할당 해제됩니다.

내가 궁금한 점이 있지만, 컴파일러는 스택을 사용하여 레지스터로 짤 수없는 모든 로컬 변수를 추적합니다.

+2

스택의 변수는 대개 반복마다 할당/할당 해제되지 않습니다 (컴파일러가 그런 식으로 변수 저장을 구현할 수는 있지만 다소 어리석은 일입니다). 변수는 스택에 한 번만 할당되므로, 생성자는 모든 루프가 끝날 때마다 모든 루프 및 소멸자의 항목에서 호출됩니다. 함수가 반환 될 때까지 할당 취소되지 않습니다. – Falaina

+0

그래, alloc/dealloc에 ​​의해, 나는 실제로 객체가 생성/소멸된다는 것을 의미한다. (이것은 "obj가 할당 해제 된"OP가 의미하는 것이라고 생각한다). 물리적 인 메모리 자체가 그 자리에 그대로있을 가능성이 높습니다. –

3

개체의 범위는 둘러싸는 중괄호 [함수 또는 루프 중괄호]에 있습니다. 그래서 범위가 끝나자 마자 객체의 소멸자가 호출되고 객체의 할당이 해제됩니다.

두 번째 질문은 컴파일러가 루프를 처리하고 개체를 추적 할 수있는 자체 전략을 유지 관리하는지 여부에 달려 있습니다.

2

스택의 객체는 루프에 중첩되어 있어도 한 번 할당되거나 할당이 취소됩니다.
그러나 모든 반복마다 생성자와 소멸자가 호출됩니다.