2014-02-21 2 views
3

는 내가이 코드를 한 경우 : 오브젝트 인스턴스가 사용하는 메모리 유형을 구별 할 수있는 방법이 있습니까?

#include <assert.h> 

class Foo { 
public: 
    bool is_static(); 
    bool is_stack(); 
    bool is_dynamic(); 
}; 

Foo a; 

int main() 
{ 
    Foo b; 
    Foo* c = new Foo; 

    assert(a.is_static() && !a.is_stack() && !a.is_dynamic()); 
    assert(!b.is_static() && b.is_stack() && !b.is_dynamic()); 
    assert(!c->is_static() && !c->is_stack() && c->is_dynamic()); 

    delete c; 
} 

그것을 위해 그렇게 할 is_stack, is_static, is_dynamic 방법을 구현할 수는 주장은

을 충족한다? 사용

예 : 메모리의 계산 크기 ++ 고통을 시설, 표준 C를 사용하여 Foo 타입의 특정 객체가 스택에 사용하지만, 정적 또는 동적 메모리

+0

+1 : 당신이 (거의) 올바른 용어를 사용했기 때문에. –

답변

6

를 계산하지 것은이 작업을 수행 할 수없는 작업 개체를 보장하기 위해 그들이 할당 된 방법과 상관없이 같은 방법.

그러나 OS에 프로세스 메모리 맵을 물어보고 주어진 객체가 속하는 주소 범위를 파악하면됩니다. (이 일을하는 동안 산술 uintptr_t을 사용하십시오.)

1

아래로 스크롤 운영 체제에 따라 사용할 수있는 옵션의 다양한 제공하는 두 번째 대답에 :

How to determine CPU and memory consumption from inside a process?

것은 나 또한 추천을 C++로 추적 메모리 Alloactions에이 기사를 읽고 :

http://www.almostinfinite.com/memtrack.html

은 그냥이 작품의 톤 있다는 인식.

+0

[첫 번째 답변] (http://stackoverflow.com/a/64166/153285)을 의미 할 수 있습니다. 위의 것은 질문입니다. 그리고 힙 사용과 스택을 차별화하는 것은 다루지 않습니다. – Potatoswatter

1

여기에서는 의도가 좋지만 접근 방법이 최선이 아닙니다. 당신이 당신의 방법에 대한 임시 변수를 할당 스택에

  • : 몇 가지를 생각해 보자. 임시 변수의 수명이 평소에 관심 무엇 스택 관련

  • 그것을 손상되지 않은 짧은 때문에 항상 당신의 프로그램 경우 발생할 수있는 사용 얼마나 많은 스택 걱정 이 없습니다 포인터를 사용하고 데이터 범위 에 액세스합니다. 이러한 유형의 문제에 대해서는 isStatic 함수가 도움이되지 않습니다.

  • 동적 메모리 할당의 경우 일반적으로 새/삭제 연산자 을 무시하고 카운터를 사용하여 메모리 사용량을 추적합니다. 그래서 다시 isDynamic 함수가 트릭을 수행하지 않을 수도 있습니다. 전역 변수의 경우

  • (당신은 정적 말했지만 나는 범위를 약간 확장) 잘 당신은 항상 그들에 대해 걱정하지 않는다 별도의 데이터 섹션 (안 스택이나 힙)에 할당 그들이 때문에 이 정적으로 할당되며 링크 시간에 공간이 충분하지 않으면 링커에서 알려줍니다. 더하여 가 진짜로 주소 범위를 알고 싶은 경우에 당신은지도 파일을 검사 할 수있다.

대부분의 관심사는 컴파일 타임에 해결되며 솔직히 거의 신경 쓰지 않습니다. 그리고 나머지는 (동적 메모리 할당) 다르게 취급됩니다. 그러나 그러한 방법을 고집한다면 은 모든 데이터 섹션에 대해 주소 범위를 제공하는지도 파일을 생성하도록 링커에 지시하고 목적에 맞게 사용할 수 있습니다.

+0

그렇습니다. 그러나 함수 호출 및 스택 사용이 런타임 조건에 의존하기 때문에 일부 객체가 스택에서 사용하는 메모리의 양을 계산하는 것은 컴파일 시간에 일반적으로 해결할 수 없습니다. – user3123061

+0

아니요 :) 정적으로 할당 된 스택이므로 컴파일 타임에 함수에서 사용할 최대 스택을 알 수 있습니다. 런타임시 달라지는 점은 프로그램이 특정 시점에 얼마나 많은 스택을 사용할 것인지입니다. 그것은 얼마나 많은 함수가 호출되는지에 달려 있습니다. – Pandrei

+0

@Pandrei - 일부 시스템에서는 사소한 코드에 대해서는 말할 수 있지만 컴파일러는 컴파일 타임에 외부 호출의 스택 사용을 알 수 없습니다. 일부 시스템에서는 스레드 스택이 부분 또는 전체 인터럽트 프레임을 수용해야 할 수도 있습니다. –

관련 문제