อ่าน 3 นาที
ระยะก้าวของอาร์เรย์
ในการเขียนโปรแกรมคอมพิวเตอร์ระยะห่าง (stride) ของอาร์เรย์ (หรือเรียกอีกอย่างว่าค่าเพิ่ม (increment ), ระยะห่าง (pitch)หรือขนาดขั้นตอน (step size ))...
ระยะก้าวของอาร์เรย์
ในการเขียนโปรแกรมคอมพิวเตอร์ระยะห่าง (stride) ของอาร์เรย์ (หรือเรียกอีกอย่างว่าค่าเพิ่ม (increment ), ระยะห่าง (pitch)หรือขนาดขั้นตอน (step size )) คือจำนวนตำแหน่งในหน่วยความจำระหว่างจุดเริ่มต้นของ องค์ประกอบ อาร์เรย์ ที่อยู่ติดกัน โดยวัดเป็นไบต์หรือหน่วยของขนาดองค์ประกอบอาร์เรย์ ระยะห่างนี้ต้องไม่น้อยกว่าขนาดขององค์ประกอบ แต่สามารถมากกว่าได้ ซึ่งแสดงถึงพื้นที่ว่างเพิ่มเติมระหว่างองค์ประกอบ
อาร์เรย์ที่มีช่วงก้าว (stride) เท่ากับขนาดของแต่ละองค์ประกอบในอาร์เรย์นั้น จะเรียกว่าอาร์เรย์ที่ต่อเนื่องกันในหน่วยความจำ อาร์เรย์ประเภทนี้บางครั้งเรียกว่าอาร์เรย์ที่มีช่วงก้าวหน่วย (unit stride) อาร์เรย์ที่มีช่วงก้าวหน่วยบางครั้งมีประสิทธิภาพมากกว่าอาร์เรย์ที่มีช่วงก้าวมากกว่า แต่บางครั้งอาร์เรย์ที่มีช่วงก้าวมากกว่าก็อาจมีประสิทธิภาพมากกว่าสำหรับ อาร์เรย์ 2 มิติหรือหลายมิติขึ้นอยู่กับผลกระทบของการแคชและรูปแบบการเข้าถึงที่ใช้ ซึ่งสามารถอธิบายได้ด้วยหลักการของความใกล้เคียง (locality ) โดยเฉพาะอย่างยิ่ง ความใกล้เคียง เชิงพื้นที่ (spatial locality )
สาเหตุที่ทำให้ก้าวเดินไม่เท่ากัน
อาร์เรย์อาจมีช่วงก้าวที่ใหญ่กว่าความกว้างขององค์ประกอบในหน่วยไบต์ได้ในอย่างน้อยสองกรณี:
อาร์เรย์ขนานที่ซ้อนทับกัน
บางภาษาอนุญาตให้ ถือว่า อาร์เรย์ของโครงสร้างเป็นอาร์เรย์คู่ขนาน ที่ซ้อนทับกัน โดยมีช่วงก้าวที่ไม่ใช่หน่วย:
#include <stdio.h>struct MyRecord { int value ; char * text ; };/** พิมพ์เนื้อหาของอาร์เรย์ของจำนวนเต็มด้วยค่า stride ที่กำหนด โปรดทราบว่า size_t เป็นชนิดข้อมูลที่ถูกต้อง เนื่องจาก int อาจเกิด overflow ได้ */ void print_some_ints ( const int * arr , int length , size_t stride ) { int i ; printf ( "Address \t\t Value \n " ); for ( i = 0 ; i < length ; ++ i ) { printf ( "%p \t %d \n " , arr , arr [ 0 ]); arr = ( int * )(( unsigned char * ) arr + stride ); } }int main ( void ) { int ints [ 100 ] = { 0 }; struct MyRecord records [ 100 ] = { 0 };print_some_ints ( & ints [ 0 ] , 100 , sizeofints [ 0 ]); print_some_ints ( & records [ 0 ] .value , 100 , sizeofrecords [ 0 ] ); return 0 ; }สำนวนนี้เป็นรูปแบบหนึ่งของการเล่นคำ
ภาคตัดขวางของอาร์เรย์
บางภาษา เช่นPL/IหรือFortranอนุญาตให้ใช้สิ่งที่เรียกว่าการตัดขวางอาร์เรย์ซึ่งเลือกคอลัมน์หรือแถวบางส่วนจากอาร์เรย์ขนาดใหญ่[ 1 ] : หน้า 262 ตัวอย่างเช่น หากประกาศอาร์เรย์สองมิติเป็น
ประกาศอาร์เรย์ some_array ( 12 , 2 ) fixed ;อาร์เรย์หนึ่งมิติที่ประกอบด้วยคอลัมน์ที่สองเพียงอย่างเดียว สามารถอ้างอิงได้ดังนี้
some_array ( * , 2 )ตัวอย่างของอาร์เรย์หลายมิติที่มีช่วงก้าวที่ไม่ใช่หน่วย
การใช้ค่า stride ที่ไม่เป็นหน่วยนั้นมีประโยชน์อย่างยิ่งสำหรับรูปภาพ เพราะช่วยให้สามารถสร้างภาพย่อยได้โดยไม่ต้องคัดลอกข้อมูลพิกเซล ตัวอย่างในภาษา Java:
public class GrayscaleImage { private final int width , height , widthStride ; /** ข้อมูลพิกเซล พิกเซลในแถวเดียวกันจะถือว่าต่อเนื่องกันเสมอในตัวอย่างนี้ */ private final byte [] pixels ; /** ค่าออฟเซ็ตของพิกเซลแรกภายใน pixels */ private final int offset ;/** คอนสตรัคเตอร์สำหรับข้อมูลต่อเนื่อง */ public Image ( int width , int height , byte [] pixels ) { this . width = width ; this . height = height ; this . pixels = pixels ; this . offset = 0 ; this . widthStride = width ; }/** คอนสตรัคเตอร์ของส่วนย่อย */ public Image ( int width , int height , byte [] pixels , int offset , int widthStride ) { this . width = width ; this . height = height ; this . pixels = pixels ; this . offset = offset ; this . widthStride = widthStride ; }/** ส่งคืนส่วนย่อยของภาพนี้เป็นภาพใหม่ ภาพนี้และภาพใหม่จะใช้ พิกเซลร่วมกัน ดังนั้นการเปลี่ยนแปลงใดๆ ในภาพที่ส่งคืนจะสะท้อนให้เห็นในภาพใหม่นี้ */ public Image crop ( int x1 , int y1 , int x2 , int y2 ) { return new Image ( x2 - x1 , y2 - y1 , pixels , offset + y1 * widthStride + x1 , widthStride ); }/** ส่งคืนค่าพิกเซลที่พิกัดที่ระบุ */ public byte getPixelAt ( int x , int y ) { return pixels [ offset + y * widthStride + x ] ; } }สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ระยะก้าวของอาร์เรย์
ในการเขียนโปรแกรมคอมพิวเตอร์ระยะห่าง (stride) ของอาร์เรย์ (หรือเรียกอีกอย่างว่าค่าเพิ่ม (increment ), ระยะห่าง (pitch)หรือขนาดขั้นตอน (step size ))...
สาเหตุที่ทำให้ก้าวเดินไม่เท่ากัน
อาร์เรย์อาจมีช่วงก้าวที่ใหญ่กว่าความกว้างขององค์ประกอบในหน่วยไบต์ได้ในอย่างน้อยสองกรณี:
อาร์เรย์ขนานที่ซ้อนทับกัน
บางภาษาอนุญาตให้ ถือว่า อาร์เรย์ของโครงสร้าง เป็น อาร์เรย์คู่ขนาน ที่ซ้อนทับกัน โดยมีช่วงก้าวที่ไม่ใช่หน่วย:
ภาคตัดขวางของอาร์เรย์
บางภาษา เช่น PL/I หรือ Fortran อนุญาตให้ใช้สิ่งที่เรียกว่า การตัดขวางอาร์เรย์ ซึ่งเลือกคอลัมน์หรือแถวบางส่วนจากอาร์เรย์ขนาดใหญ่ [ 1 ] : หน้า 262 ตัวอย่างเช่น หากประกาศอาร์เรย์สองมิติเป็น