2009-11-25 4 views
0

STL을 많이 좋아합니다. 그것은 코딩 알고리즘을 매우 편리하게합니다. 왜냐하면 parition, find, binary_search, iterators, priority_queue 등의 모든 기본 요소를 제공 할 것이기 때문입니다. 게다가 메모리 누수에 대해 걱정할 필요가 없습니다.연산자 오버로드 STL의 성능 저하는 무엇입니까

내 관심사는 STL 작동을 얻는 데 필요한 연산자 과부하의 성능 저하입니다. 비교를 위해, 나는 ==가 필요한 의미를 제공한다고 생각합니다. 클래스를 컨테이너에 추가하려면 == 연산자를 오버로드해야합니다.

얼마나 편리합니까?

메모리 누수에 대한 또 다른 옆 질문 : STL 컨테이너를 사용하는 경우

  1. 는 메모리 누수가 적 일어날 수 있습니까?
  2. Java에서 메모리 누수가 발생할 수 있습니까?
+4

Java에서 메모리 누수가 발생할 수 있습니다. 여기를 참조하십시오. http://www.ibm.com/developerworks/library/j-leaks/ – schnaader

+2

오버로드 된 연산자는 기본적으로 하나의 메소드입니다. –

+0

좋은 링크 @schnaader. 내가 의견을 내기 위해 +1을 줄 수 있기를 바랍니다. –

답변

10

제네릭 형식에 stl 알고리즘을 사용하는 경우 어떤 식 으로든 비교 논리를 제공해야합니다. 연산자 오버로딩은 다른 함수와 비교하여 성능상의 불이익을 가지지 않으며 다른 함수와 마찬가지로 함수 호출 오버 헤드를 제거하기 위해 인라인 될 수 있습니다.

많은 표준 컨테이너와 알고리즘도 std::less을 사용하므로 == 대신 기본적으로 <을 사용합니다.

표준 컨테이너 자체는 누출되지 않지만 포인터를 사용하여 반드시 자신이 소유 한 메모리를 정리하지 않는 객체 (예 : 포인터)를 저장할 수 있습니다.

자바에서 메모리를 누설하기는 어렵지만 좋은 객체 소유권 의미론을 사용하지 못해서 문제가 발생할 수 있다는 의미는 아니며 사용 가능한 메모리를 모두 사용할 수 없다는 것을 의미하지는 않습니다 그리고 충돌.

4

나는 이전 포스터에 C++ 응답을 남기 겠지만, 100 % 예라면 Java에서 메모리 누수가 발생할 수 있습니다. 당신이보기에 좋은 메모리 프로파일 링 도구를 가지고 있지 않다면 너무 찾기가 어려울 것입니다. 일반적으로 자동화 된 가비지 콜렉션 언어 (예 : Java, Python 등)의 메모리 누수는 객체를 반복적으로 인스턴스화 할 때 발생하지만 A. 객체가 완료되면 정리하지 않습니다 (예 : "close"를 호출). 데이터베이스 연결) 또는 B. 자동 가비지 컬렉터가 가비지 콜렉션을 결코 수집 할 수 없도록 해당 객체를 가리키는 다른 객체 (예 : Hashtables)를 계속 유지합니다.

응용 프로그램은 안정된 상태이어야한다 생각에 당신은 이들 중 하나가 나타나면 :

http://java.sun.com/javase/6/docs/api/java/lang/OutOfMemoryError.html

당신은 몇 가지 재미있는 debuggin를 위해 안으로)

+0

아마도 이것은 C++ 기울기가 너무 많습니다. 그러나 응용 프로그램에서 참조가 아직 남아있는 객체가 메모리를 사용하면 실제로 메모리 누수가 발생합니까? 이 상황에서 메모리는 여전히 이론적으로 응용 프로그램의 개체에서 찾을 수 있습니다. '진정한'메모리 누수는 일부 메모리에 대한 마지막 참조가 실제로 파괴 된 곳이므로 응용 프로그램의 메모리에 대한 포인터가 전혀없는 것입니다. –

+0

하지만 효과는 같습니다. – UncleBens

+0

나는 자동 가비지 콜렉션을 가진 언어에서 정의가 조금 바뀐 것 같아. 나에게 이러한 언어 중 하나의 메모리 누출은 프로그래머가 가비지 컬렉터가 프로그래머가 수행 한 객체에 대한 참조를 정리하지 못하도록하는 것 쓰레기 수거가 예상됩니다. 자동 가비지 수집기는 더 이상 다른 객체를 참조하지 않는 객체를 정리할만큼 똑똑합니다. Java로 메모리를 지속하려면, 여전히 놓여있는 객체에 대한 활성 참조가 있어야합니다. –

1

이후 연산자 오버로딩 단순히 함수 호출을 발생시키고, 어쨌든 작업을 수행하는 함수를 작성해야합니다. 오버 헤드는 0입니다. 연산자 오버로딩은 x.equals (y) 대신 x == y 또는 x.compaterTo (y) 대신 x < y와 같은 작업을 수행 할 수 있도록 편의성을 제공합니다. 컴파일러는 기본적으로 x == (y) 또는 x를 생성합니다. < (y) (컴파일은되지 않지만 아이디어는 얻을 수 있습니다).

1

"페널티"는 실제로 보너스입니다.

가장 일반적인 알고리즘 정렬을 살펴 보겠습니다. C에는 연산자 오버로딩이 없습니다.결과적으로 qsort은 함수 포인터를 사용합니다. 각 비교는 (런타임에) 간접 함수 호출을 사용합니다. C++에는 연산자 오버로딩이 있습니다. std::sort의 경우 각 비교는 직접 호출 (링커에서 고정) 또는 인라인 (컴파일러에서)입니다. 이것은 멀리 먼 효과적입니다. std::sortqsort보다 6 배 빠르다는 것은 드문 일이 아닙니다.

일반적으로 연산자 오버로딩을 사용하면 다른 코드 및 컴파일러에서 악용 될 수있는 형식으로 "기본"함수를 표현하는 것이 훨씬 쉬워집니다. 대안은 훨씬 덜 효율적입니다. 어느 그들은 (프로그래머 상처) 매크로에 의존하거나 함수 포인터에 의존 (옵티 마이저와 CPU를 다치게.)

1

내 유일한 관심사는 STL의 작업을 진행하는 것이 필요하다 연산자 오버로딩의 성능 저하입니다. 비교를 위해, 나는 ==가 필요한 의미를 제공한다고 믿는다. 클래스를 컨테이너에 추가하려면 == 연산자를 오버로드해야합니다.

존재하지 않습니다. 오버로드 된 연산자는 함수 호출로 구현됩니다. 연산자를 오버로드하지 않았다면 대신 사용할 함수를 정의해야합니다. 따라서 성능은 정확히과 동일합니다. 더 단순한 구문입니다.