C에서 배열의 길이는 어떻게 결정됩니까?


최상의 답변

당신이 묻는 것이 약간 불분명하지만 질문은 배열이 주어진 것이라고 가정합니다 , 길이를 어떻게 결정합니까?

C에는 알 수없는 크기의 배열, 알려진 상수 크기의 배열, 가변 길이 배열 등 여러 유형의 배열이 있습니다.

상수 크기, 크기는 유형의 일부입니다. 유형이 int[10] 인 배열의 길이는 매우 10입니다. C는 유형에서 직접 추출 할 수있는 메커니즘이 없습니다 (C ++와 달리 ),하지만 sizeof를 통해 간접적으로 수행 할 수 있습니다.

int a[] = {1,2,3,4,5,6,7,8,9,0};

size\_t sz = sizeof a / sizeof *a; // or .../sizeof a[0], same thing

printf("size = \%zu\n", sz);

가변 길이 배열의 크기는 동일한 코드를 사용하여 sizeof로 계산할 수도 있습니다. 이 경우 런타임에 실행됩니다.

scanf("\%d", &x);

int a[x];

size\_t sz = sizeof a / sizeof *a;

printf("size = \%zu\n", sz);

마지막으로 경계를 알 수없는 배열은 정의상 알 수없는 크기입니다. 프로그램 로직을 통해 가져와야합니다.

extern int a[];

size\_t sz = something\_from\_the\_module\_that\_defines\_a();

물론 C의 네이 키드 배열은 함수에 전달할 수 없으므로 크기를 호출자 측에서 계산하고 별도로 전달해야합니다.

void f(int *a, size\_t sz);

int a[] = {1,2,3,4,5,6,7,8,9,0};

f(a, sizeof a / sizeof *a);

멤버 배열은 물론 값으로 함수에 전달할 수 있습니다.

struct a10 {int a[10];};

void f(struct a10 s) {

size\_t sz = sizeof s.a / sizeof *s.a;

}

답변

주요 질문은 여러 번 검색 할 것입니까? 그렇다면 해시 테이블이나 다른 인덱스를 한 번 만들어 신속하게 찾을 수 있습니다. 디스크에서 데이터를 읽는 동시에 해시 테이블을 생성 할 수 있습니다 (원인 인 경우).

이 작업이 일회성이고 데이터가 디스크에서로드되는 경우 다음을 수행합니다. 검색이 IO와 겹쳤습니다. 2 개 이상의 버퍼를 사용할 수 있습니다.

또 다른 질문은 무언가가 있는지 아는 것에 만 관심이 있습니까? 아니면 검색하려는 관련 데이터가 있습니까? 숫자가 있는지 알고 싶다면 비트 배열을 사용하여보다 간결하게 표현할 수 있습니다.

그 외에도 가장 빠른 비교를 사용하는 인라인 C 코드가 가장 좋습니다. 컴파일러가 제공하는 모든 최적화 옵션을 사용하십시오. 일부 컴파일러는 포인터, 카운터 또는 인덱싱을 사용하더라도 동일한 빠른 코드를 생성 할 수 있습니다.

int * first = ..., * last = ...;

for ( ; first <= last; ++first ) if ( *first == target ) ...

또는

int * first = ..., count = ...;

for ( ; count-- > 0; ++first ) if ( *first == target ) ...

또는

int * first = ..., count = ..., index = ...;

for ( ; index < count; ++index ) if ( first[index] == target ) ...

컴파일러에게 어셈블러 소스를 출력하여 자신이 무엇을하는지 알도록 요청하는 것이 속임수라고 생각할 수 있지만, 성능에 대해 정말로 염려하는 경우 적은 수의 컴파일러에서 필요할 수 있습니다. 최상의 결과입니다.

그런 다음 여러 스레드를 사용하는 등 다른 작업을 수행 할 수 있습니다. 8 개의 코어를 사용할 수있는 경우 어레이를 8 개의 섹션으로 분할하고 각 섹션에 대한 스레드를 시작할 수 있습니다. 그러나 비교 비용이 낮 으면 스레드 시작 비용이 너무 높을 수 있습니다.

배열이 클 수 있으므로 가상 메모리 스와핑으로 인해 속도가 느려질 수 있습니다. 자체 메모리 매핑 파일 백업을 사용하면 매핑을 제어하고 매핑을 해제하여 실제 메모리 사용량을 낮게 유지할 수 있습니다. 방금 검색을 마친 섹션의 매핑을 해제하여 이후 섹션에 메모리를 사용할 수 있습니다.

몇 가지 아이디어 만 있습니다. 행운을 빕니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다