배열의 계단
Stride of an array컴퓨터 프로그래밍에서 어레이의 계단(증분, 피치 또는 스텝 크기라고도 함)은 연속적인 어레이 요소의 시작 사이에 있는 메모리의 위치 수로서, 바이트 또는 어레이 요소의 크기 단위로 측정된다.보폭은 요소 크기보다 작을 수 없지만 요소 사이의 여분의 공간을 나타내는 더 클 수 있다.
각 원소의 크기와 정확히 같은 크기의 층계를 가진 배열은 기억에서 연속적이다.그러한 배열은 때때로 단위 보폭을 가지고 있다고 한다.유닛 스트레이드 어레이는 비 유닛 스트라이드 어레이보다 효율적이기도 하지만, 비 유닛 스트레이드 어레이는 캐싱의 효과와 사용되는[citation needed] 액세스 패턴에 따라 2D 또는 다차원 어레이에 더 효율적일 수 있다.이는 지역성, 특히 공간적 지역성의 원리에 기인할 수 있다.
비단위 보폭 사유
배열은 최소 세 가지 경우 원소의 너비(바이트)보다 큰 보폭을 가질 수 있다.
패딩
많은 언어(C 및 C++ 포함)는 기계의 단어 길이 및/또는 캐시 라인 크기 중 하나를 더 잘 활용할 수 있도록 구조물을 패딩할 수 있다.예를 들면 다음과 같다.
구조상의 A { 인트로 a; 마를 뜨다 b; }; 구조상의 A myArray[100];
위의 코드 조각에서,myArray
만약 C 코드가 32비트 아키텍처에 대해 컴파일러가 최소 메모리 사용보다는 최소 처리 시간에 최적화되었다면, 5바이트(int+char의 경우 4바이트)가 아니라 8바이트의 보폭을 가질 수 있을 것이다.
겹치는 병렬 배열
일부 언어에서는 구조물의 배열을 비단위 보폭을 가진 겹치는 병렬 배열로 취급할 수 있다.
#include <stdio.h> 구조상의 마이레코드 { 인트로 가치를 매기다; 마를 뜨다 *문자 메시지를 보내다; }; /** 주어진 보폭으로 인트 배열의 내용을 인쇄한다. size_t는 int가 넘칠 수 있으므로 올바른 유형이라는 점에 유의하십시오.*/ 공허하게 하다 print_some_ints(경시하다 인트로 *arr, 인트로 길이, size_t 성큼성큼 걷다) { 인트로 i; 활자화하다("주소\t\t가치\n"); 을 위해 (i=0; i < 길이; ++i) { 활자화하다(%p\t%d\n", arr, arr[0]); arr = (인트로 *)((서명이 없는 마를 뜨다 *)arr + 성큼성큼 걷다); } } 인트로 본래의(공허하게 하다) { 인트로 ints.[100] = {0}; 구조상의 마이레코드 기록.[100] = {0}; print_some_ints(&ints.[0], 100, 의 크기 ints.[0]); print_some_ints(&기록.[0].가치를 매기다, 100, 의 크기 기록.[0]); 돌아오다 0; }
이 사자성어는 일종의 말장난이다.
배열 단면
PL/I와 같은 일부 언어는 배열 단면이라고 알려진 것을 허용하는데, 이 단면들은 큰 배열에서 특정 열이나 행을 선택한다.[1]: p.262 예를 들어 2차원 배열을 다음과 같이 선언하는 경우
선언하다 모종의 (12,2)고정된;
두 번째 열로만 구성된 하나의 차원의 배열을 다음과 같이 참조할 수 있다.
모종의(*,2)
비단위 보폭을 갖는 다차원 배열의 예
단위가 아닌 보폭은 영상에 특히 유용하다.픽셀 데이터를 복사하지 않고도 하위 이미지를 만들 수 있다.Java 예제:
공중의 계급 그레이스케일이미지 { 사유의 최종의 인트로 너비, 높이, 폭스트라이드; /** 픽셀 데이터.이 예에서 단일 행의 픽셀은 항상 연속적인 것으로 간주된다.*/ 사유의 최종의 바이트[] 픽셀; /** 픽셀 내에서 첫 번째 픽셀의 오프셋 */ 사유의 최종의 인트로 상쇄하다; /** 관련 데이터 생성자 */ 공중의 이미지(인트로 너비, 인트로 높이, 바이트[] 픽셀) { 이.너비 = 너비; 이.높이 = 높이; 이.픽셀 = 픽셀; 이.상쇄하다 = 0; 이.폭스트라이드 = 너비; } /*** 하위 섹션 생성자 */ 공중의 이미지(인트로 너비, 인트로 높이, 바이트[] 픽셀, 인트로 상쇄하다, 인트로 폭스트라이드) { 이.너비 = 너비; 이.높이 = 높이; 이.픽셀 = 픽셀; 이.상쇄하다 = 상쇄하다; 이.폭스트라이드 = 폭스트라이드; } /** 이 이미지의 하위 영역을 새 이미지로 반환한다.이 이미지 및 새 이미지 공유 픽셀, 따라서 반환된 영상에 대한 변경 사항이 이 영상에 반영될 것이다.*/ 공중의 이미지 곡식을 거두다(인트로 x1, 인트로 y1, 인트로 x2, 인트로 y2) { 돌아오다 새로운 이미지(x2 - x1, y2 - y1, 픽셀, 상쇄하다 + y1 * 폭스트라이드 + x1, 폭스트라이드); } /** 지정된 좌표에서 픽셀 값 반환 */ 공중의 바이트 getPixelat(인트로 x, 인트로 y) { 돌아오다 픽셀[상쇄하다 + y * 폭스트라이드 + x]; } }
참조
- ^ Hughes, Joan K (1979). PL/I Structured Programming (second ed.). New York: John Wiley and Sons. ISBN 0-471-01908-9.