나는 int 배열을 가지고 있으며, 함수가 호출 될 때마다 배열의 모든 값을 'x'로 설정하고 싶습니다.배열의 모든 요소를 값으로 설정하는 가장 좋은 방법은 무엇입니까?
나는 memset을 살펴 봤지만 그것은 내가 생각하기에 바이트 배열에서만 작동 할 것이다.
나는 명백한 for 루프를 수행 할 수 있지만, 표준 lib 함수가 더 나은 결과를 얻을 것이라고 추측하고있다. 누구 알아?
나는 int 배열을 가지고 있으며, 함수가 호출 될 때마다 배열의 모든 값을 'x'로 설정하고 싶습니다.배열의 모든 요소를 값으로 설정하는 가장 좋은 방법은 무엇입니까?
나는 memset을 살펴 봤지만 그것은 내가 생각하기에 바이트 배열에서만 작동 할 것이다.
나는 명백한 for 루프를 수행 할 수 있지만, 표준 lib 함수가 더 나은 결과를 얻을 것이라고 추측하고있다. 누구 알아?
꽤 많이 반복하면됩니다. 값이 0 인 것을 알고 있으면 memset
을 0으로 설정합니다 (비트 표현에 대한 지식이있는 다른 값과 유사). 표준 lib에는 특정 사용자 유형을 알 수 없으므로 표준 lib 솔루션은 없습니다. 더 비싼 모양 업 나중에 그러나 메모리의 트리플 양의 비용, 그리고 - (모두 O(n)
시간입니다) memset
및 루핑 외에도
, 은 실제로 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)
으로 초기화되지만 추가 메모리가 필요하며 각각의 액세스는보다 광범위합니다.
x86 시스템을 사용 중이라면 여기에 일부 어셈블리를 사용할 수 있습니다. 예를 들어 gcc :
__asm__(
"rep stosb"
: "=a"('x'), "=c"(count), "=D"(array)
);
트릭을 수행해야합니다.
rep stosb
은 AL
의 값을 받아 ES:EDI
이 가리키는 연속적인 메모리 위치에 할당합니다. 위치 번호는 ECX
에 지정됩니다.
MOVSB
and STOSB
마찬가지로
, 그래서 이것은 그것에 대해 갈 수있는 좋은 방법입니다.
어셈블리 해킹을 추가하지 마십시오! 당신이 쓰는 것은 단지'memset (3)'이고, 컴파일러 (최소한 GCC)는'memset'을 위해 그것을 할 것입니다. (당신이 나를 믿지 않는다면 생성 된 어셈블리를 확인하십시오.) 결과 : _no_ 이득에 대한 이해하기 어렵고 이식성이없는 프로그램 (컴파일러가 수행하는 것보다 훨씬 나빠질 수 있음). – vonbrand
@vonbrand : 당신 말이 맞을 것입니다. 당신이 말하는 것을 알고 있습니다. 당신이 가진 모든 것이 망치 일 때, 모든 문제는 손톱처럼 보입니다. 나는 C보다 x86 어셈블리에 더 익숙하다.'memset'에 대해서 기억하려고 할 때 나는 할 수 없다. 그러나 나는 STOSB를 기억할 수 있었다. –
정보 주셔서 감사합니다. 필자의 경우에는 여러 프로세서에 이식 가능한 코드를 작성하여 사용할 수 없으므로 새로운 x86 asm.thanks를 배우는 것이 좋습니다! –
아래 논리는 도움이됩니다.
...
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);
}
}
이것은 for (i = 0; i
루프가 가장 좋습니다. – cnicutar
'memset'은 아마 내부적으로 루프 일 뿐이므로 루프가 잘 작동 할 것입니다. –
C에서 루프가이를 수행하는 방법입니다. C++에는 사용할 수 있다면'std :: fill'이 있습니다. –