2013-02-02 4 views
2

나는 int 배열을 가지고 있으며, 함수가 호출 될 때마다 배열의 모든 값을 'x'로 설정하고 싶습니다.배열의 모든 요소를 ​​값으로 설정하는 가장 좋은 방법은 무엇입니까?

나는 memset을 살펴 봤지만 그것은 내가 생각하기에 바이트 배열에서만 작동 할 것이다.

나는 명백한 for 루프를 수행 할 수 있지만, 표준 lib 함수가 더 나은 결과를 얻을 것이라고 추측하고있다. 누구 알아?

+0

루프가 가장 좋습니다. – cnicutar

+1

'memset'은 아마 내부적으로 루프 일 뿐이므로 루프가 잘 작동 할 것입니다. –

+0

C에서 루프가이를 수행하는 방법입니다. C++에는 사용할 수 있다면'std :: fill'이 있습니다. –

답변

2

꽤 많이 반복하면됩니다. 값이 0 인 것을 알고 있으면 memset을 0으로 설정합니다 (비트 표현에 대한 지식이있는 다른 값과 유사). 표준 lib에는 특정 사용자 유형을 알 수 없으므로 표준 lib 솔루션은 없습니다. 더 비싼 모양 업 나중에 그러나 메모리의 트리플 양의 비용, 그리고 - (모두 O(n) 시간입니다) memset 및 루핑 외에도

+0

memset을 0으로 설정하는 것은'int myArray [80] = {0}'이 모든 배열 요소를 0으로 초기화하기 때문에 일종의 역효과를 낳습니다. – Rapptz

+2

@Rapptz : 정의시에만. 이후의 채우기에는 memset이 필요합니다. – sheu

1

, 은 실제로 O(1)에서 수행 할 수 있습니다.

This article은 어떻게 수행 할 수 있는지 설명합니다.

아이디어는 추가 스택 (논리적으로는 array + pointer to top)과 array를 유지하는 것입니다. 추가 배열은 처음 초기화되었을 때 (0에서 n까지의 숫자) 나타낼 것이며 스택은 어떤 요소가 이미 수정되었습니다.

array[i]에 액세스 할 때 stack[additionalArray[i]] == i && i < top 인 경우 array[i]입니다. 그렇지 않으면 "초기화 된"값입니다.

array[i] = x을 수행 할 때 아직 초기화되지 않은 경우 (앞에서와 마찬가지로) additionalArray[i] = stack[top]을 설정하고 top을 증가시켜야합니다.

이 결과는 O(1)으로 초기화되지만 추가 메모리가 필요하며 각각의 액세스는보다 광범위합니다.

2

x86 시스템을 사용 중이라면 여기에 일부 어셈블리를 사용할 수 있습니다. 예를 들어 gcc :

__asm__(
      "rep stosb" 
      : "=a"('x'), "=c"(count), "=D"(array) 
      ); 

트릭을 수행해야합니다.

rep stosbAL의 값을 받아 ES:EDI이 가리키는 연속적인 메모리 위치에 할당합니다. 위치 번호는 ECX에 지정됩니다.

옆으로, 최근의 프로세서 Intel has made many efforts to improve the performance of MOVSB and STOSB 마찬가지로

, 그래서 이것은 그것에 대해 갈 수있는 좋은 방법입니다.

+0

어셈블리 해킹을 추가하지 마십시오! 당신이 쓰는 것은 단지'memset (3)'이고, 컴파일러 (최소한 GCC)는'memset'을 위해 그것을 할 것입니다. (당신이 나를 믿지 않는다면 생성 된 어셈블리를 확인하십시오.) 결과 : _no_ 이득에 대한 이해하기 어렵고 이식성이없는 프로그램 (컴파일러가 수행하는 것보다 훨씬 나빠질 수 있음). – vonbrand

+0

@vonbrand : 당신 말이 맞을 것입니다. 당신이 말하는 것을 알고 있습니다. 당신이 가진 모든 것이 망치 일 때, 모든 문제는 손톱처럼 보입니다. 나는 C보다 x86 어셈블리에 더 익숙하다.'memset'에 대해서 기억하려고 할 때 나는 할 수 없다. 그러나 나는 STOSB를 기억할 수 있었다. –

+0

정보 주셔서 감사합니다. 필자의 경우에는 여러 프로세서에 이식 가능한 코드를 작성하여 사용할 수 없으므로 새로운 x86 asm.thanks를 배우는 것이 좋습니다! –

0

아래 논리는 도움이됩니다.

... 
int a[100] = {0}; 
int b = 5; 
memset_ex(a, 100, &b, sizeof(int)); 
... 

memset_ex(void *buf, int buf_size, void *value, int size_of_type) 
{ 
    int i = 0; 

    for(i = 0; i <= (buf_size - size_of_type); i +=size_of_type) 
    { 
     memcpy((buf + i), value, size_of_type); 
    } 
} 
+0

이것은 for (i = 0; i

관련 문제