2016-10-30 1 views
1

얼마 전에 한 사람이 모든 코드를 .h 파일에 저장하면 메모리 관리 문제가 발생한다고 말했습니다. 왜냐하면 한 클래스의 복제본이 너무 많기 때문입니다. .h/.cpp 파일에 코드를 저장하면이 문제를 피할 수 있습니다. 그게 사실이야?헤더 파일에 코드를 저장하면 C++에서 메모리 관리 문제가 발생합니까?

나는 이미이 주제에 대한 몇 가지 정보를 봤는데, 그게 습관에 불과하다는 것을 알았습니다. 그렇다면 .h 파일에 모든 코드를 저장하는 경우의 메모리 문제는 무엇입니까?

+0

무엇주세요? 네가 묻는 것을 이해하지 못한다. –

+0

메모리 문제는 없지만 컴파일러 방화벽을 사용할 수없는 이름 오염 문제가 있습니다. 그리고 차례로 순환 모듈 관계에 문제가 있음을 의미합니다. 컴파일러 방화벽을 사용하면 A의 구현은 B의 인터페이스에 의존 할 수 있으며 그 반대의 경우도 별도의 모듈로 사용할 수 있지만 순수 헤더 모듈을 사용하면 어떻게 든 퍼지해야합니다. –

+0

글쎄, 몇 가지 문제를 일으킬 수있는 헤더의 코드를 두 번 포함하려고하면 포함 가드를 사용해야합니다. 하지만 그 외에 다른 문제는 없습니다. 예를 들어, 많은 부스트 ​​라이브러리는 헤더 전용입니다. –

답변

2

... 한 사람이 .h 파일에 모든 코드를 저장하면 메모리 관리 문제가 발생한다고 말했습니다. [...] .h/.cpp 파일에 코드를 저장하면이 문제는 피할 수 있습니다. 그게 사실이야?

메모리 관리는 일반적으로 런타임에 동적 메모리를 처리하는 것을 말합니다. 명확성을 위해 : 헤더에 모든 코드를 작성하는 것은 그 코드와 아무 상관이 없습니다. 그러나 이렇게하면 컴파일러에서 실제로 사용하는 메모리 양이 늘어날 수 있습니다. 그렇다면 한 명인이 의미하는 바가 있다면 일 수 있습니다. 그렇지만 접근법에서 가장 큰 문제는 아닙니다.

나는 하나 개의 클래스

이 바보 인수입니다 너무 많은 중복을 얻을 수 있기 때문에. 사실, 정의에 헤더 파일 만 사용한다는 것은 클래스 정의가 정확히 한 번 포함되어있는 번역 단위가 정확히 하나 있다는 것을 의미합니다.

잠재적 인 문제는 단일 번역 단위에 모든 헤더 파일의 모든 정의가 포함되어 있다는 것입니다. 모든 것이 한 번에 처리되기 때문에 컴파일러에 필요한 최대 메모리는 잠재적으로 더 높습니다. 아마도 대부분의 프로젝트에서는 중요하지 않지만 libreoffice와 같은 것으로는 아마 문제가 될 수 있습니다.


헤더에 모든 기능을 정의하고있는 더 큰 문제 - 즉, 하나의 번역 단위를 사용하여 - 모든 헤더에 어떤 변화가, 그러나 작은, 하나의 대규모 번역 단위가 변경됩니다, 그리고 당신이 될 것이다 다시 컴파일해야합니다. 복수형 인 이 더 작 으면, 변환 단위는 변경 사항의 영향을받는 항목 만 재 컴파일해야합니다.

그래서 모든 재 컴파일은 처음부터 컴파일하는 것보다 느립니다. 물론 컴파일에 몇 분이 걸리는 경우 문제가되지 않지만 처음부터 컴파일하는 데 몇 시간이 걸리는 프로젝트의 경우 필수적입니다.

+0

"너무 많은 중복"은 인라인 함수를 의미한다고 생각합니다. 링커가 버려야하는 다른 번역 단위에 여러 복사본이 있습니다 (하나만 제외). 클래스 정의가 여러 번역 단위에 포함되어 있기 때문에 "똑같이 클래스 정의가 정확히 한 번 번역 단위에 포함됩니다"라는 부분은 잘못되었습니다 - 정확히 반대입니다 - 모든 동일한 인라인 함수가 있으므로주의해야합니다 의. – anatolyg

+0

@anatolyg 모든 코드가 헤더에있는 경우이 ** 다른 번역 단위 **는 어디에서 왔습니까? – user2079303

+0

죄송합니다. 오해했습니다. 필자는 하나의 번역 단위 만 사용하여 헤더 파일에서 코드를 전혀 사용하지 않았습니다. – anatolyg

1

"한 사람"은 그가 무슨 말을하고 있는지 모릅니다.

헤더 파일을 사용하면 컴파일하는 동안 컴파일러 (또는 컴파일 단계를 구현하는 프로그램)가 컴파일하는 동안 더 많은 메모리를 소비 할 수 있습니다. 그것은 컴파일러의 구현 방법에 달려 있습니다. 그리고 양질의 컴파일러가이를 처리 할 것입니다. 일부 컴파일 단위에 컴파일러가 메모리가 부족해 지도록 코드가 충분하면 또 다른 문제가 있으며 헤더 파일 사용과 관련이 없습니다.

프로그램에서 메모리 관리 문제를 일으키는 코드를 작성하면 해당 코드를 헤더 파일에 저장하면 아무런 차이가 없습니다. 나쁜 코드는 프로그램의 메모리 관리 문제 (누출, 매달린 포인터 사용 등)가 있는지 여부에 관계없이 해당 코드의 일부는 헤더 파일에 있습니다.

헤더 파일을 부주의하게 사용하는 경우 여러 개체 파일에 각각 일부 기능의 정의가 포함될 수있는 경우가 있습니다. 기술적으로 이는 프로그램의 메모리 사용량을 증가시킬 수 있지만 헤더 파일을 사용하는 경우 기술의 세부 사항이 약간 다를 수 있지만이를 완화 할 수있는 코딩 기술이 있습니다. 즉, 헤더 파일에 코드를 넣는 것이 아니라 (자체적으로) 차이를 만드는 불량 코드를 작성하는 것입니다.

헤더 파일 (또는보다 일반적으로 전처리 기)을 사용하는 데는 다른 문제가 있습니다. 그러나 헤더 파일을 사용하면 이러한 우려를 관리하는 데 도움이됩니다. 그리고 이러한 우려는 실제로 메모리 관리 문제와 관련이 없습니다.

실제로 일반적으로 헤더 파일과 컴파일 단위 (일명 .h 및 .cpp 파일)를 적절하게 구분하는 것이 좋습니다. 그러나 헤더 파일에 라이브러리에 대한 함수 정의를 넣는 것이 유리한 경우도 있습니다 (예 : 템플릿 라이브러리).

관련 문제