2012-07-08 4 views
2

내 응용 프로그램에 전역 스택을 만들고이 스택에 특정 객체를 배치하려고합니다. 이러한 개체는 고정 된 크기가 아닙니다.사용자 정의 스택 할당 자, 대체 삭제

현재 가지고 있습니다.

static char contextStack[CONTEXT_MAX_SIZE]; 
static char *top = &contextStack[0]; 

나는 문제는 내가 스택을 그만 팝업 할 수있는 delete 연산자를 구현하는 것이 방법이다

static void *operator new(size_t size) { 
    void *Result; 
    Result = top; 
    top = top + size; 
    return Result; 
}; 

상속 기본 클래스의 new 연산자를 대체? 아이템이 얼마나 큰지 말해주지 않습니까? 각 항목의 크기를 배열에 저장해야합니까?

(p.s) 마지막으로 생성 된 것은 항상 삭제 된 첫 번째 것입니다. 그리고 스택을 준수합니다.

답변

1

이 경우 메모리를 처리하는 데는 여러 가지 옵션이 있습니다. 메모리를 증가하는 순서로 반환하는 경우 (해당되는 것처럼 보임) 크기를 기억할 필요가 없습니다. 할당 된 마지막 메모리 블록은 에서에서 까지의에서 할당되며, 위로 가기로 설정하면 delete으로 충분하므로 산술 연산을 수행 할 필요가 없습니다.

내림차순으로 메모리를 할당하는 경우 (스택에서 일반적으로 사용됨) 스택 자체에 크기를 저장할 수 있습니다. 포인터 계산을 수행하여 새 Result (top - requested_size)을 얻은 다음 sizeof(int)을 감소시키고 거기에 크기를 저장하고 top 포인터를 해당 포인터로 설정합니다.

플랫폼의 정렬 제한을 알고 있어야하며 플랫폼이 모든 데이터 형식에 정렬되지 않은 액세스를 허용하더라도 성능 및 스레드 안전성을 이유로 데이터를 정렬 할 수 있습니다.

+0

doh! ofcourse delete operator = top에서 p를! 오름차순 스택에 어떤 단점이 있습니까? contextStack이 멋진 주소에서 시작되도록하고 새로운 연산자에서 결과가 앞으로 채워지는지 확인하는 것이 맞습니까? –

0

스택을 다룰 때 어셈블리에 대한 경험으로 말하면 : 코드가 스택에서 어떤 것을 팝하려고 할 때, 그 코드는 무언가가 얼마나 크거나 예상되는지를 알기위한 책임이 있습니다. 스택은 한 줄로 된 거대한 데이터 조각 일 뿐이므로 기술적으로 많은 조각이 있으면 가능한 한 큰 조각을 벗을 수 있습니다.

그래서 코드가 객체의 크기가 얼마나 큰지 알 필요가 있습니다 (사용자에게없는 것 같은 정보). 물론 배열에 크기를 저장하라는 제안을 포함하여 여러 가지 다른 방법으로 "스택"을 구현할 수 있습니다. 그렇게하면 스택이있는 단순성이 더 복잡해 지지만 구현시 필요할 수 있습니다.

2

각 항목의 크기를 배열에 저장해야합니까?

당신은 별도의 저장 영역을 사용하거나이 malloc 구현은 종종 따라 전략을 사용할 수 있습니다 그들은 당신에게 돌아 포인터의 앞에 알려진 위치에 크기를 저장합니다. free에 전화 할 때, 그들은 전달한 포인터 바로 앞의 위치를 ​​확인하고 거기에서 크기를 가져 와서 할당을 해제합니다.

귀하의 경우에는 청크 자체 바로 뒤의 청크 크기를 밀 수 있습니다. 스택을 팝 할 때가되면 먼저 크기를 띄운 다음 데이터 덩어리를 띄웁니다.

스택을 사용하여 작업 할 때 알아야 할 사항 중 하나는 데이터 정렬입니다. 아키텍처에 따라 홀수 오프셋 (4, 8 등분 할 수없는 오프셋)으로 멀티 바이트 유형을 저장하면 성능 저하 또는 버스가 발생할 수 있습니다 오류. 스택에 푸시 된 연속 요소 사이에 여분의 "패딩"을 추가해야하는지 확인하려면 플랫폼 특성을 확인해야합니다.

1

스택을 만들 때 템플릿 클래스를 사용하면 각 항목의 크기를 알 필요가 없으므로 훨씬 쉽습니다.