가변 길이 어레이 사용에 대한 오버헤드가 있습니까?
가변 길이 어레이를 사용하는 데 약간의 오버헤드가 있습니까?실행 시 명령줄 인수를 통해 어레이 크기를 전달할 수 있습니까?어레이를 자동으로 동적으로 할당하는 것과 달리 어레이를 도입하는 이유는 무엇입니까?
VLA에는 약간의 오버헤드가 있습니다(일반적인 이름의 컴파일 시간 크기 어레이와 비교).
이 시간 를 가지지만 수 있는 합니다(「 」, 「 」, 「 」, 「 」sizeof
크기를 어딘가에이로 인해 어레이별 메모리 오버헤드가 경미해집니다.그러나 VLA는 자동 개체로만 선언할 수 있기 때문에 이 메모리 오버헤드는 아무도 알아차리지 못할 것입니다.이는 적분 유형의 추가 로컬 변수를 선언하는 것과 같습니다.
둘째, VLA는 보통 스택에 할당되지만 크기가 다양하기 때문에 컴파일 시 메모리 내의 정확한 위치를 알 수 없습니다.이러한 이유로 기본 구현에서는 일반적으로 메모리 블록에 대한 포인터로 구현해야 합니다.이것에 의해, (포인터용의) 메모리 오버헤드가 몇개 더 생겨나지만, 이것은 위에서 설명한 이유로 전혀 의미가 없습니다.또한 실제 어레이를 검색하려면 포인터 값을 읽어야 하므로 약간의 성능 오버헤드가 발생합니다.은 에 액세스 했을 .malloc
-ed 어레이(및 명명된 컴파일 시간 크기 어레이는 사용할 수 없습니다).
VLA의 크기는 런타임 정수 값이기 때문에 물론 명령줄 인수로 전달할 수 있습니다.VLA는 크기가 어디서 나오든 상관없습니다.
VLA는 할당/할당 취소 비용이 낮은 런타임 크기의 어레이로 도입되었습니다.은 "의 컴파일 시간 어레이비용이 크기)와 ""이라는 이름의 어레이 사이에 .malloc
어레이사이즈는 비용은 높다).ed ( 실실 ) 。
일반적으로는 수 없습니다.malloc
-ed 어레이이러한 기능은 일반적인 자동 라이프 타임을 가진 빠른 런타임 크기의 어레이를 필요로 하는 경우에 한정됩니다.
가변 길이 어레이에는 런타임 오버헤드가 있지만 이를 측정하려면 상당한 노력이 필요합니다.주의:sizeof(vla)
는 컴파일 시간 상수가 아닙니다.vla
는 가변 길이 배열입니다.
어레이의 크기는 런타임에 함수에 전달될 수 있습니다.명령줄 인수의 크기를 정수로 변환하여 런타임에 함수에 전달하면 동작합니다.
변수 길이 배열이 사용되는 이유는 변수가 자동으로 올바른 크기로 할당되고 함수 종료 시 자동으로 해제되기 때문입니다.이것에 의해, 스페이스를 과도하게 할당할 필요가 없어져(대부분 최소 사이즈로 작업하는 경우, 가능한 최대 사이즈에 충분한 스페이스를 할당할 수 있습니다), 메모리 청소에 관한 문제를 회피할 수 있습니다.
또, 다차원 어레이인 AFIK에서는, Fortran과 같이 동작합니다.모든 치수를 동적으로 설정할 수 있습니다.어레이의 선두 치수를 제외한 모든 치수를 고정하는 것이 아니라, 모든 치수를 동적으로 설정할 수 있습니다.
적어도 SPARC(Solaris 10)의 GCC 4.4.2에서는 VLA의 일부 런타임 오버헤드의 구체적인 증거.
다음의 2개의 파일에 대해 생각해 주세요.
vla.c - 가변 길이 어레이 사용
#include <assert.h>
#include <stddef.h>
extern size_t identity_matrix(int n, int m);
size_t identity_matrix(int n, int m)
{
int vla[n][m];
int i, j;
assert(n > 0 && n <= 32);
assert(m > 0 && m <= 32);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
vla[i][j] = 0;
}
vla[i][i] = 1;
}
return(sizeof(vla));
}
fla.c - 고정 길이 배열 사용
#include <assert.h>
#include <stddef.h>
extern size_t identity_matrix(int n, int m);
size_t identity_matrix(int n, int m)
{
int fla[32][32];
int i, j;
assert(n > 0 && n <= 32);
assert(m > 0 && m <= 32);
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
fla[i][j] = 0;
}
fla[i][i] = 1;
}
return(sizeof(fla));
}
컴파일 및 객체 파일 크기
비교를 위해 로컬 어레이의 이름은 다릅니다(vla
대fla
라고 선언되었을 때 어레이의 치수가 다릅니다.그렇지 않으면 파일은 동일합니다.
다음을 사용하여 컴파일:
$ gcc -O2 -c -std=c99 fla.c vla.c
오브젝트 파일사이즈는 'ls'와 'size'로 측정되는 것과 같이 다소 다릅니다.
$ ls -l fla.o vla.o
-rw-r--r-- 1 jleffler rd 1036 Jan 9 12:13 fla.o
-rw-r--r-- 1 jleffler rd 1176 Jan 9 12:13 vla.o
$ size fla.o vla.o
fla.o: 530 + 0 + 0 = 530
vla.o: 670 + 0 + 0 = 670
오버헤드가 어느 정도 고정되고 어느 정도 가변적인지 확인하기 위해 광범위한 테스트를 수행한 적은 없지만 VLA를 사용할 때는 오버헤드가 있습니다.
가변 길이 어레이를 사용하는 데 약간의 오버헤드가 있는지 궁금할 뿐입니다.
아니.
실행 시 명령줄 인수를 통해 어레이 크기를 전달할 수 있습니까?
네.
어레이를 자동으로 동적으로 할당하는 것과 달리 어레이를 도입하는 이유는 무엇입니까?
자동 할당은 컴파일 시 알려진 고정 크기만 허용합니다.
「 」 )malloc
)는, 히프에 어레이를 보존합니다.히프는 메모리 용량이 크지만, 액세스 속도는 느립니다.
VLA는 어레이를 스택에 배치함으로써 동작합니다.이것에 의해, 할당과 액세스는 지극히 고속이 됩니다만, 통상, 스택은 소규모(수 KB)입니다.VLA가 스택에 오버플로우 했을 경우, 무한 재귀와 구별할 수 없습니다.
VLA의 오버헤드는 거의 없습니다(기껏해야 스택포인터 추가가 됩니다).동적 할당에는 수동 메모리 관리가 필요하며 VLA 스택 기반 할당보다 느립니다.또한 어레이의 "자동" 선언에는 어레이 크기에 대한 컴파일 시간 식이 필요합니다.단, 스택 오버플로가 발생하면 정의되지 않은 동작이 발생하므로 VLA는 비교적 작게 유지해야 합니다.
명령줄 인수를 통해 어레이 크기를 전달할 수 있지만 직접 처리하려면 코드를 작성해야 합니다.
언급URL : https://stackoverflow.com/questions/2034712/is-there-any-overhead-for-using-variable-length-arrays
'programing' 카테고리의 다른 글
인덱스를 사용하여 panda DataFrame의 특정 셀 값 설정 (0) | 2022.09.18 |
---|---|
MySql 표시 성능 (0) | 2022.09.18 |
계산된 속성 'name'이(가) 할당되었지만 설정자가 없습니다(v-model 없음). (0) | 2022.08.28 |
파라미터화된 mapGetters를 저장할 위치(계산된 컴포넌트 또는 메서드) (0) | 2022.08.28 |
express에서 파일 다운로드JS(sendFile) 서버에서 VueJ로, 손상된 파일을 반환하고 있습니까? (0) | 2022.08.28 |