Visual C++ 2008에서이 코드를 시도한 결과 A와 B가 같은 주소를 가지고 있지 않음을 보여줍니다. C++ 스택 및 범위
int main()
{
{
int A;
printf("%p\n", &A);
}
int B;
printf("%p\n", &B);
}
그러나 B가 정의됩니다 때 더 이상 존재하지 않기 때문에
, 컴파일러하지 않는 이유가 이해가 안 ... 같은 스택 위치를 재사용 할 수 있다는 것을 나에게 보인다 매우 간단한 최적화 (더 큰 변수와 재귀 함수의 컨텍스트에서 중요 할 수 있음)처럼 보이는 것을 수행하는 것처럼 보입니다. 그리고 재사용하는 것이 CPU 나 메모리에서 더 무거워지는 것 같지 않습니다. 누구든지 이것에 대한 설명이 있습니까?
나는 "그것이보기보다 훨씬 더 복잡이기 때문에"대답은의 라인을 따라 추측하지만, 솔직히 아무 생각이 없습니다.
편집 : 아래의 답변과 의견에 대한 일부 정밀도.
이 코드의 문제는이 함수가 호출 될 때마다, 스택은 "너무 많은 일 개 정수를"성장한다는 것입니다. 물론이 예제에서는 아무런 문제가 없지만 큰 변수와 재귀 호출을 고려하면 쉽게 피할 수있는 스택 오버플로가 있습니다.
내가 제안하는 것은 메모리 최적화이지만 성능에 어떤 영향을 미치는지는 알 수 없다.
그런데 이것은 에서 발생합니다. 빌드는 모든 최적화를 수행합니다.
릴리스 빌드 또는 디버그 빌드를 컴파일하고 있습니까? – Michael
당신이 제안하는 것은 ** 공간 ** 최적화이지만 반드시 속도 최적화는 아닙니다. –
모든 지역이 캐시 라인에 맞추기에는 너무 크면 캐시 미스가 없으므로 속도 최적화가됩니다. – Michael