2012-08-02 3 views
0

게재 위치 new 연산자를 오버로드하여 사용 된 메모리 크기가 지정된 클래스에 충분한 지 확인합니다. 우리는이 크기를 압니다.게재 위치 new 연산자에 과부하가 걸리는 추가 비용은 얼마입니까?

template <size_t MAXSIZE> 
class PlacementNewTest { 
public: 
    void* operator new (size_t size, void* where) 
    { 
    if (size > MAXSIZE) { 
     throw bad_alloc(); 
    } 
    return where; 
    } 
}; 

하자이 같은 단순화 된 상황에서 사용되는 말 : 건설은 더 많거나 적은이 방법에 나는이 PlacementNewTest <이> 클래스 사용이 테스트 단계에서

char buffer[200]; 

class A : public PlacementNewTest<sizeof buffer> { 
public: 
    char a[100]; 
}; 

class B : public A { 
public: 
    char b[200]; 
}; 


int main() { 
    A* a = new (buffer) A; // OK 
    a->~A(); 
    B* b = new (buffer) B; // throwed bad_alloc 
    b->~B(); 
} 

하지만 릴리스 코드 I에서 그것을 제거하는 것을 고려하십시오. 귀하의 경험에 비추어 볼 때, 귀하의 경험에 비추어 볼 때,이 추가 시험 수업을 제거하지 말아야하는 비용은 얼마입니까? 이 확인의 유일한 비용은 if (size > MAXSIZE)입니까?

class PlacementNewNOP { 
public: 
    void* operator new (size_t size, void* where) 
    { 
    return where; 
    } 
}; 

은 아마이 질문에 중요하지 않다 -하지만 : 즉 는, 성능 등의 재정에 대한 벌은 무엇 이이며,해야, C++ 03. 우리는 C++ 11로 업그레이드 할 수 없습니다. 부스트도 옵션이 아닙니다. 단지 C++ 03입니다.

+1

당신이 그것을 보았을 때''assert (reinterpret_cast (where) % ​​alignof (A) == 0)'등등을 확인해야합니다. –

+0

@KerrekSB 어떻게 그럴수가 있소? -/I 일반적으로 정렬 경찰입니다 .-D –

+0

"조숙 한 최적화는 프로그래밍의 모든 악 (또는 적어도 대부분)의 뿌리입니다." 당신이 그들을 직면 할 때까지 성능 벌칙을 생각하지 마십시오. 그리고 당신이 그들과 대면 할 때 노력에 대해 가능한 개선을 시도하십시오. –

답변

1

가상 메서드를 사용하지 않는 한 비교에서 오버 헤드가 없어야합니다. 바인딩은 정적입니다.

물론 예외 오버 헤드가 있지만 그다지 발생하지 않아야하므로 무시해도 안전합니다.

+0

왜 이렇게 생각하니? 제 말은, g ++ 컴파일러가 어떻게 내부적으로 그러한 배치 새로운 연산자 오버로딩을 구현하는지 설명 할 수 있습니까? – PiotrNycz

+0

@PiotrNycz 컴파일 중 오버로드가 해결되었으므로 런타임 중에 오류가 해결되지 않습니다. 런타임 중에는 간단한 함수 호출이됩니다. 다시 말하지만, 모든 메소드 (가상 메소드 제외)는 정적으로 바인딩됩니다. –

+0

그래서, 새로운 연산자 오버로딩이 없으면 "단순 함수 호출"또는 오버 헤드가없는 오버 헤드가 발생합니다. – PiotrNycz

관련 문제