게재 위치 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입니다.
당신이 그것을 보았을 때''assert (reinterpret_cast (where) % alignof (A) == 0)'등등을 확인해야합니다. –
@KerrekSB 어떻게 그럴수가 있소? -/I 일반적으로 정렬 경찰입니다 .-D –
"조숙 한 최적화는 프로그래밍의 모든 악 (또는 적어도 대부분)의 뿌리입니다." 당신이 그들을 직면 할 때까지 성능 벌칙을 생각하지 마십시오. 그리고 당신이 그들과 대면 할 때 노력에 대해 가능한 개선을 시도하십시오. –