RISC-V环境下均值滤波代码中二维数组访问疑问
RISC-V环境下二维图像数组访问解析
1. 二维数组的内存本质
你代码里的input[width][height]和output[width][height]这类固定大小的二维数组,在内存中是连续线性存储的,遵循**行优先(Row-Major)**布局:
- 整个数组先存储第0行的所有
height个unsigned char元素,接着依次存储第1行、第2行……直到第width-1行。 - 单个元素
input[row][col]对应的内存地址计算公式为:
由于每个数组起始地址 + row * height + colunsigned char占1字节,这刚好和你计算的.GRAY图像存储空间width*height字节完全匹配——.GRAY格式就是把每个像素的灰度值(0-255)按行连续存储,所以读入图像数据后,直接就能用二维数组的方式访问每个像素。
2. 代码中数组访问的实际逻辑
以input[row][col]为例:
- 嵌套循环里,
i是当前处理的目标像素行,j是目标列;m和n遍历3x3滤波核的偏移量。 - 计算
row = i + m、col = j + n后,边界判断确保访问的行/列在数组范围内(避免越界访问非法内存),合法的话就把对应位置的灰度值加到求和变量sum中。 - 对于
output[i][j],是把计算得到的均值结果,存储到输出数组的对应位置,本质是找到output数组起始地址 +i * height + j的内存位置,写入1字节数据。
3. RISC-V环境下的底层访问逻辑
在RISC-V汇编层面,访问这类数组就是做地址计算 + 内存操作:
- 先通过乘法指令计算
row * height(因为height是宏定义的常量,编译器会优化成移位或直接计算),加上col得到偏移量。 - 再把偏移量和数组的基地址(
input或output的起始地址)相加,得到目标内存地址。 - 最后用
lb(加载字节)指令读取input的像素值,用sb(存储字节)指令写入output的结果值。
内容的提问来源于stack exchange,提问作者ramwen0
相关产品推荐
相关产品推荐

