이 질문은 SO에서 얼어 붙은 수신을 얻었으므로 거기에서 삭제하고 대신 시도해보기로 결정했습니다. 여기에 맞지 않다고 생각되면 적어도 내가 본 예제를 찾는 방법에 대한 의견을 남겨주십시오 ...
C99 VLA를 사용하면 현재 표준 힙 사용 C ++ RAII 메커니즘과 비교하여 실질적인 이점 을 제공하는 예를들 수 있습니까 ?
내가 따르는 예는 다음과 같습니다.
- 힙 사용에 비해 쉽게 측정 가능한 (10 %) 성능 이점을 달성하십시오.
- 전체 배열이 전혀 필요하지 않은 좋은 해결 방법이 없습니다.
- 고정 된 최대 크기 대신 동적 크기를 사용하면 실제로 이점이 있습니다.
- 일반적인 사용 시나리오에서 스택 오버플로가 발생하지 않을 것입니다.
- C ++ 프로젝트에 C99 소스 파일을 포함시키기 위해 성능이 필요한 개발자를 유혹 할 수있을 정도로 강력해야합니다.
컨텍스트에 대한 설명 추가 : C99가 의미하는 VLA를 의미하며 표준 C ++에는 포함되어 있지 않습니다. int array[n]
여기서는 n
변수입니다. 그리고 다른 표준 (C90, C ++ 11)에서 제공하는 대안보다 우선하는 사용 사례의 예를 봅니다.
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
몇 가지 아이디어 :
- varargs를 사용하는 함수는 항목 수를 자연스럽게 합리적으로 제한하지만 유용한 API 수준 상한은 없습니다.
- 낭비되는 스택이 바람직하지 않은 재귀 함수
- 힙 오버 헤드가 나쁜 많은 작은 할당 및 릴리스.
- 성능이 중요하고 작은 함수가 많이 인라인 될 것으로 예상되는 임의 크기의 행렬과 같은 다차원 배열을 처리합니다.
- 주석에서 : 동시 알고리즘, 힙 할당에는 동기화 오버 헤드가 있습니다.
Wikipedia에는 내 기준을 충족시키지 못하는 예가 있습니다. 힙을 사용하는 것과의 실질적인 차이는 컨텍스트가 없으면 관련이 없기 때문입니다. 더 많은 컨텍스트가 없으면 항목 수가 스택 오버플로를 일으킬 수있는 것처럼 보이기 때문에 이상적이지 않습니다.
참고 : 나는 예제를 직접 구현하기 위해 예제 코드 또는 이것으로부터 이익을 얻을 수있는 알고리즘을 제안합니다.
alloca
이 아닙니다. 기본적으로 동일하다고 생각합니다). 그러나 그 멀티 스레드 된 것은 훌륭합니다. 편집 질문이 포함되어 있습니다!
malloc
동작이 C 표준을 따르는 지 여부는 논쟁의 여지가 있습니다.
alloca()
실제로 빛날 것 입니다 . 그러나 작은 배열은 고정 된 크기를 사용해야하며 큰 배열에는 어쨌든 힙이 필요할 수 있기 때문에 이것은 실제로 확장입니다.malloc()