학생들에게 alloca를 가르쳐야합니까? [닫은]


18

alloca현실에서 얼마나 널리 사용 됩니까? 학생들에게 alloca이해가되었을 때 사용하도록 가르쳐야 합니까? 아니면 절대 사용하지 말라고 가르쳐야합니까? C ++ RAII 배경에서 비롯된 free것으로, 특히 여러 개의 종료 점이있는 함수에서 수동으로 호출 할 필요가 없다는 생각이 들립니다.



8
그들에게 C99 VLA를 가르치지 않겠습니까?

@cnicutar alloca ()는 구현에 따라 다르지만 최소한 많은 구현에서 실패시 NULL을 반환합니다. C99 VLA는 실패를 나타내는 방법이 없습니다.
bio를 보시오

2
@ sbi : SO의 경우 이것은 폐쇄 형 질문으로 클로저가 SO 포스트가해야한다고 생각하는 형식에 실제로 맞지 않습니다. 너무 주관적이며 명확한 답이 없으며 단지 의견입니다. 어느 것이 좋지만 SO에는 적합하지 않습니다. 또한 OP의 대표를 존중하는 사람 중 누구도 투표에 참여하지 않기 때문에이 질문을 주제로 마무리하는 것입니다.
Paul Sasik

1
@PascalCuoq 당신은 어쨌든 alloca / VLAs를 많이 할당해서는 안됩니다. 현재 컨텍스트에서 "많은"내용이 확실하지 않은 경우을 사용하십시오 malloc.

답변:


31

일반적인 C 프로그래밍 과정을 수강 하는 경우 표준이 아닌 것을 가르쳐서 는 안됩니다. 초보 프로그래머는 비표준 및 / 또는 이식 불가능한 코드를 불필요하게 작성해야합니다. 이러한 방식으로 가르쳐 졌기 때문에 지난 20-30 년 동안 소프트웨어 업계에서 큰 문제가되었습니다. 그들에게 표준을 가르치지 않고 표준을 가르치는 데 드는 비용은 천문학적 일 것입니다.

알고리즘이나 응용 프로그램 프로그래밍에 대한 고급 과정을 보유하고 있다면 언급하는 것이 좋습니다. 반면에, 하드 리얼 타임 임베디드 앱에서 Windows 애플리케이션 보풀에 이르기까지 그 기능을 사용하지 않고 15 년 동안 모든 것을 프로그래밍했습니다.


다른 방법으로 더 나은 방법을 찾지 못하는 유일한 방법은 일부 Windows 버전에서 스택 스매시 감지를 수행하는 것입니다. ; 그 코드를 본 지 오래되었습니다. 그것은 효과가 있었지만 약간의 공포였습니다.
Donal Fellows

13

두 가지 일이 발생하는 것을 볼 수 있습니다.

  1. 학생들은의 영향을 이해하고 alloca스택과 힙의 차이점에 대해 읽고 alloca신중하게 사용 합니다. (있을 것 같지 않게)

  2. 학생들은 "와우, malloc걱정하지 않아도됩니다. "라고 생각 free합니다. 과도하게 사용하고 스택 오버플로가 발생하며 무슨 일이 일어나고 있는지 전혀 모릅니다.

설명 alloca하고이 코드를 실행 하면 훨씬 낫다고 생각합니다 .

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

출처 : http://www.strchr.com/alloca

그들에게 위험을 보여주고 사용하지 말라고 지시하십시오. 그들은 여전히 ​​스택 대 힙에 대해 배우고, 위험을 감수하고, 표준적인 것들로 나아갈 수 있습니다.


1
나는 대부분의 학생들이 예제 코드를 보여준 후에도 여전히 두 번째 범주에 속한다고 생각합니다.
rightfold

@WTP-아마도 그럴 수 있지만, 일어날 수있는 일을 보여준 후에도 사용하지 말라고 지시하는 이유입니다.
BlackJack

4
왜 그 코드가 _alloca아닌 코드를 사용 alloca합니까? 왜 결과가 나오나요?
Keith Thompson

5

이 질문에 대한 답 은 먼저 목표가 무엇인지에 근거해야합니다 .

C를 작성하고 기존 C 코드로 작업하는 방법을 이미 프로그래밍하는 방법을 이미 알고있는 사람에게 가르치고 싶습니까? 그렇다면 alloca 및 기타 원하는 사항을 알려주십시오.

반면에 우연의 일치로 C 만 사용하는 입문 과정을 가르치는 경우 (C는 매우 작은 언어이기 때문에) 중요한 부분 (모듈 식 프로그램, 서브 루틴, 모음 작성 등)에 중점을 두어야합니다. ). malloc이 대부분의 경우 충분하기 때문에 학생의 관점에서 alloca는 중요한 중복이며 좋은 코드 관점에서는 수동 메모리 관리가 성가신 방법과 다른 언어 가이 문제를 처리 하는 방법을 명시 적으로 언급하는 것이 좋습니다. 메모리 관리에 관한 것들을 alloca 또는 RAII로 제한하기 때문에 여러분은 이것들에 대해 스스로를 제한해서는 안되며 이미 언급했듯이, 다른 언어로 작업을 수행하는 다른 "보다 표준적인"방법과 비교하면 alloca의 목적을 이해하기가 훨씬 쉽습니다. (또는 C99 ...)


2

아니.

C 프로그래머가 alloca의 존재를 인식해야하는 유일한 이유는이를 사용하는 레거시 코드를 이해하고 수정하는 것입니다.

의 사용은 alloca하나입니다

  1. 쓸모없는, 즉 자동 저장 기간의 고정 크기 변수로 대체 될 수 있습니다. 또는
  2. 위험한 스택 오버플 로가 발생하기를 기다리고 있습니다.

실제 사례를 찾지 못한 몇 가지 사고 실험 외에도 alloca쓸모 없거나 취약하지 않은 (또는 위의 2 가지 중 하나) 사용 사례는 없습니다 (또는 VLA).


2
물론 아무도 책임감있게 그것을 사용할 수 없었습니다. 아뇨.
DeadMG

"책임있는"유일한 사용은 alloc고정 크기 자동 어레이와 100 % 동일하며 휴대 성이 떨어집니다.
R .. GitHub 중지 지원 얼음

그렇다면 아무도 절대 넘치지 않는 몇 킬로바이트와 같은 동적 양을 할당하기를 원하지 않을 것입니다. 또는 사용 가능한 금액을 알려주는 OS API 함수를 호출하십시오. 또는 스택 크기를 많이 늘리십시오.
DeadMG

KB가 적고 KB가 충분하다고 확신하는 T foo[5000];경우 아무거나 사용할 수 있습니다 .
R .. GitHub 중지 지원 얼음

T에 간단한 기본 생성자가있는 경우에만 해당됩니다. 성능이 좋지 않은 경우 간단한 메모리 제로화로도 비용이 발생할 수 있습니다. 그러나 다른 유형은 더 복잡한 기본 구성 논리를 가질 수 있습니다. 예를 들어의 배열을 동적으로 만들려면 std::mutex커널 호출과 컨텍스트 스위치를 5 천 개의 뮤텍스에 대해 호출 할 수 있습니다. 싸지 않다. 배열 뒤에 로컬 변수를 배치하는 데 필요한 추가 캐시 비용은 말할 것도 없습니다.
DeadMG

1

로컬 변수에 스택 공간을 할당하는 데 사용되는 저수준 컴파일러 원칙을 가르치지 않는 한 내 의견으로는 사용하지 않는 것이 좋습니다. 그런 맥락에서 가르치십시오.


0

GCC의 문서 에 몇 가지 실제적인 장단점이 있습니다 alloca(). 실질적인 관점에서 볼 때 적절한 양의 자유 소프트웨어가 소프트웨어를 사용하므로 기존 코드에서 작동 방식과 사용 위치를 이해하는 것이 좋습니다.

-Wl,-stack=새 스택 크기 를 gcc로 전달 하면 최대 스택 크기가 증가합니다. 프로젝트에서을 사용 alloca()하거나 큰 임시 배열을 할당하거나 특정 상황에 따라 다른 깊이를지나 재귀를 사용하는 경우이 작업을 수행해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.