2011-12-26 5 views
3

비 재귀 함수에서는 대용량 데이터 유형을 스택에 배치해도 괜찮습니까?스택에 큰 물체를 두지 않아야합니까?

손쉬운 장소는 C 기능으로 정리해야합니다.

나는 이와 같은 데이터의 임의의 패킷을 읽고 쓸 수있는 C 함수를 가지고있다.

int do_something() 
{ 
    char buf[9000]; 
    struct ot_packet_t p; 

    pkt_init(&p); 
    pkt_set_type(&p, "WDAT"); 
    pkt_write_uint32(&p, some_var); 
    pkt_write_data(&p, some_data, some_len); 

    // other stuff... 
    // if need to early exit... buf & p cleaned up. An RAII approach. 

    send_packet(buf, pkt_get_length(&p)); 
} 

나는이 질문에 C++로 태그를 붙였을뿐만 아니라 C++에도 적용 할 수 있습니다. 최소한 C++에서는 일반적으로 auto_ptr을 사용하여 힙에 할당 된 더 큰 객체를 정리합니다. C에서 나는 이것이 깔끔한 것 같지 않다고 생각하니?

+1

당신이 상상할 수있는 모든 언어에 태그를 지정하지 마십시오. 이 일반적인 질문은 고정 된 크기의 스택을 가진 플랫폼에서 네이티브 어셈블러로 컴파일되는 모든 언어 구현에 적용됩니다. – Puppy

답변

4

메인 스트림 PC의 단일 스레드 응용 프로그램에서는 우려 할 필요가 거의 없습니다. 몇 KiB 여기, 몇 Kib 있습니다. 결국 스택에 MiB 또는 2 개가 닿을 수 있습니다. 스택은 애플리케이션 비용을 최소화하면서 자동으로 커집니다.

멀티 스레드 응용 프로그램을 다루는 경우 상황이 달라집니다. 각 스레드는 고유 한 스택을 가지고 있으며 스레드가 시작될 때 스택 크기가 고정된다는 것을 이해합니다. 큰 로컬 변수로 스레드의 스택을 어수선하게 만들려면 모든 스택을 소비하고 공간이 부족할 수 있습니다. 따라서 더 큰 개체에 동적 메모리 할당을 사용하여 이러한 문제가 발생하지 않도록하는 것이 좋습니다. 단일 스레드 응용 프로그램에 대한 동적 할당을 수행 할 수 있기 때문에 프로그램이 다중 스레드 프로그램으로 발전 할 가능성이있는 경우에는 처음부터 동적 할당을 사용해야합니다. 동적 할당은 스택의 자동 할당보다 느립니다.

제한된 메모리를 가진 시스템을 다루는 경우 큰 개체 생성을 피하고 싶습니다. 한 번에 얼마나 많은 사람들이 존재하는지에 관해서는 적어도 걱정해야하며 가능한 빨리 풀어 놓아야합니다.

+0

의견에 감사드립니다. 스레드를 통해 내 라이브러리와 상호 작용할 무언가에 링크 될 라이브러리에 코드를 삽입하려고합니다. 그래서 당신은 좋은 의견입니다. – Matt

1

"다릅니다." 기계, 장치, 블록 크기 및 스택이 이미 얼마나 아래에 있는지.

예에서 비 재귀 함수의 ~ 9k 블록은 거의 항상 괜찮습니다. (예외는 작은 임베디드 장치이거나 동일한 스택에서 같은 일을하는 다른 많은 기능을 가진 경우입니다.)

순전히 개인적인 경험으로 볼 때, 일반적으로 스택을 사용하지 않습니다. 정상적인 애플리케이션 레벨 코드에서 몇 K 이상의 버퍼. 예제와 같이 패킷 전송을하고 있고 루프가 반복되는 경우 매번 동적 할당을 수행하면 성능 오버 헤드가 발생할 수 있으므로 스택에 보관하거나 정적 버퍼를 어딘가에 유지하거나 어떤 종류의 재사용 가능한 버퍼 풀.

관련 문제