如何计算大小为 1000 x 1000 的二维数组中两个元素之间的步幅? C++
How can I calculate the stride between 2 elements in a 2D array of size 1000 by 1000? C++
我试图找到索引 [0][0]
和 [0][1]
之间的步幅,以及 [0][0]
和 [1][0]
之间的步幅,以尝试了解它是如何工作的,所以我打印出它们每个的内存地址,然后得到差异,这就是我所理解的 stride 。
即:[0][0]
处的内存地址是0x00E8C140
,[0][1]
处的内存地址是0x00E8C148
,所以stride应该是8吧? (数组为二维数组大小[1000][1000]
)
for (int y = 0; y < 1000; ++y)
{
for (int x = 0; x < 1000; ++x)
{
Array[y][x] = (x == y) ? 1.0 : 0.0;
if (y == 0 && x == 0) {
printf("&Array[%d][%d]=%p\n",y, x, &Array[y][x]);
}
if (y == 0 && x == 1) {
printf("&Array[%d][%d]=%p\n",y, x, &Array[y][x]);
}
if (y == 1 && x == 0) {
printf("&Array[%d][%d]=%p\n", y, x, &Array[y][x]);
}
}
}
输出:
&Array[0][0]=00E8C140
&Array[0][1]=00E8C148
&Array[1][0]=00E8E080
我的意思是这对我来说很有意义,但我什至不确定我是否真的正确打印了内存地址,因为它太大了。我原以为基地址 ([0][0]
) 会像 1000 或其他东西。
数组[0][1]和数组[0][0]的区别是一个数组元素。差异的大小与数组元素的大小无关。因此,对于包含 char 的数组,差异将为 1,对于包含 long 的数组,在 64 位机器上差异将为 8。
array[1][0] 和 array[0][0] 之间的区别在于一行中有多少个数组元素(对于 1000 x 1000 的数组,它将是 1000 个数组元素)。差异的大小是数组元素的大小乘以一行中数组元素的数量。因此,对于包含 char 的 1000 x 1000 数组,差异将为 1 x 1000,而对于包含 long 的相同大小的数组,在 64 位机器上差异将为 8 x 1000。
这是一个使用 10 x 10 数组的示例程序:
#include <stdio.h>
int main()
{
#define ARRAY_WIDTH 10
#define ARRAY_HEIGHT 10
char CArray[ARRAY_HEIGHT][ARRAY_WIDTH];
short SArray[ARRAY_HEIGHT][ARRAY_WIDTH];
long LArray[ARRAY_HEIGHT][ARRAY_WIDTH];
printf("&CArray[0][1] - &CArray[0][0] = %ld (%p-%p) sizeof(char) = %lu\n",
(long)(&CArray[0][1]) - (long)(&CArray[0][0]), &CArray[0][1], &CArray[0][0], sizeof(char));
printf("&SArray[0][1] - &SArray[0][0] = %ld (%p-%p) sizeof(short) = %lu\n",
(long)(&SArray[0][1]) - (long)(&SArray[0][0]), &SArray[0][1], &SArray[0][0], sizeof(short));
printf("&LArray[0][1] - &LArray[0][0] = %ld (%p-%p) sizeof(long) = %lu\n",
(long)(&LArray[0][1]) - (long)(&LArray[0][0]), &LArray[0][1], &LArray[0][0], sizeof(long));
printf("&CArray[1][0] - &CArray[0][0] = %ld (%p-%p) sizeof(char) * ARRAY_WIDTH = %lu\n",
(long)(&CArray[1][0]) - (long)(&CArray[0][0]), &CArray[1][0], &CArray[0][0], sizeof(char) * ARRAY_WIDTH);
printf("&SArray[1][0] - &SArray[0][0] = %ld (%p-%p) sizeof(short) * ARRAY_WIDTH = %lu\n",
(long)(&SArray[1][0]) - (long)(&SArray[0][0]), &SArray[1][0], &SArray[0][0], sizeof(short) * ARRAY_WIDTH);
printf("&LArray[1][0] - &LArray[0][0] = %ld (%p-%p) sizeof(long) * ARRAY_WIDTH = %lu\n",
(long)(&LArray[1][0]) - (long)(&LArray[0][0]), &LArray[1][0], &LArray[0][0], sizeof(long) * ARRAY_WIDTH);
return 0;
}
该程序产生以下输出(记住我的数组只有 10 x 10):
&CArray[0][1] - &CArray[0][0] = 1 (0x7ffcff4045e1-0x7ffcff4045e0) sizeof(char) = 1
&SArray[0][1] - &SArray[0][0] = 2 (0x7ffcff404652-0x7ffcff404650) sizeof(short) = 2
&LArray[0][1] - &LArray[0][0] = 8 (0x7ffcff404728-0x7ffcff404720) sizeof(long) = 8
&CArray[1][0] - &CArray[0][0] = 10 (0x7ffcff4045ea-0x7ffcff4045e0) sizeof(char) * ARRAY_WIDTH = 10
&SArray[1][0] - &SArray[0][0] = 20 (0x7ffcff404664-0x7ffcff404650) sizeof(short) * ARRAY_WIDTH = 20
&LArray[1][0] - &LArray[0][0] = 80 (0x7ffcff404770-0x7ffcff404720) sizeof(long) * ARRAY_WIDTH = 80
我试图找到索引 [0][0]
和 [0][1]
之间的步幅,以及 [0][0]
和 [1][0]
之间的步幅,以尝试了解它是如何工作的,所以我打印出它们每个的内存地址,然后得到差异,这就是我所理解的 stride 。
即:[0][0]
处的内存地址是0x00E8C140
,[0][1]
处的内存地址是0x00E8C148
,所以stride应该是8吧? (数组为二维数组大小[1000][1000]
)
for (int y = 0; y < 1000; ++y)
{
for (int x = 0; x < 1000; ++x)
{
Array[y][x] = (x == y) ? 1.0 : 0.0;
if (y == 0 && x == 0) {
printf("&Array[%d][%d]=%p\n",y, x, &Array[y][x]);
}
if (y == 0 && x == 1) {
printf("&Array[%d][%d]=%p\n",y, x, &Array[y][x]);
}
if (y == 1 && x == 0) {
printf("&Array[%d][%d]=%p\n", y, x, &Array[y][x]);
}
}
}
输出:
&Array[0][0]=00E8C140
&Array[0][1]=00E8C148
&Array[1][0]=00E8E080
我的意思是这对我来说很有意义,但我什至不确定我是否真的正确打印了内存地址,因为它太大了。我原以为基地址 ([0][0]
) 会像 1000 或其他东西。
数组[0][1]和数组[0][0]的区别是一个数组元素。差异的大小与数组元素的大小无关。因此,对于包含 char 的数组,差异将为 1,对于包含 long 的数组,在 64 位机器上差异将为 8。
array[1][0] 和 array[0][0] 之间的区别在于一行中有多少个数组元素(对于 1000 x 1000 的数组,它将是 1000 个数组元素)。差异的大小是数组元素的大小乘以一行中数组元素的数量。因此,对于包含 char 的 1000 x 1000 数组,差异将为 1 x 1000,而对于包含 long 的相同大小的数组,在 64 位机器上差异将为 8 x 1000。
这是一个使用 10 x 10 数组的示例程序:
#include <stdio.h>
int main()
{
#define ARRAY_WIDTH 10
#define ARRAY_HEIGHT 10
char CArray[ARRAY_HEIGHT][ARRAY_WIDTH];
short SArray[ARRAY_HEIGHT][ARRAY_WIDTH];
long LArray[ARRAY_HEIGHT][ARRAY_WIDTH];
printf("&CArray[0][1] - &CArray[0][0] = %ld (%p-%p) sizeof(char) = %lu\n",
(long)(&CArray[0][1]) - (long)(&CArray[0][0]), &CArray[0][1], &CArray[0][0], sizeof(char));
printf("&SArray[0][1] - &SArray[0][0] = %ld (%p-%p) sizeof(short) = %lu\n",
(long)(&SArray[0][1]) - (long)(&SArray[0][0]), &SArray[0][1], &SArray[0][0], sizeof(short));
printf("&LArray[0][1] - &LArray[0][0] = %ld (%p-%p) sizeof(long) = %lu\n",
(long)(&LArray[0][1]) - (long)(&LArray[0][0]), &LArray[0][1], &LArray[0][0], sizeof(long));
printf("&CArray[1][0] - &CArray[0][0] = %ld (%p-%p) sizeof(char) * ARRAY_WIDTH = %lu\n",
(long)(&CArray[1][0]) - (long)(&CArray[0][0]), &CArray[1][0], &CArray[0][0], sizeof(char) * ARRAY_WIDTH);
printf("&SArray[1][0] - &SArray[0][0] = %ld (%p-%p) sizeof(short) * ARRAY_WIDTH = %lu\n",
(long)(&SArray[1][0]) - (long)(&SArray[0][0]), &SArray[1][0], &SArray[0][0], sizeof(short) * ARRAY_WIDTH);
printf("&LArray[1][0] - &LArray[0][0] = %ld (%p-%p) sizeof(long) * ARRAY_WIDTH = %lu\n",
(long)(&LArray[1][0]) - (long)(&LArray[0][0]), &LArray[1][0], &LArray[0][0], sizeof(long) * ARRAY_WIDTH);
return 0;
}
该程序产生以下输出(记住我的数组只有 10 x 10):
&CArray[0][1] - &CArray[0][0] = 1 (0x7ffcff4045e1-0x7ffcff4045e0) sizeof(char) = 1
&SArray[0][1] - &SArray[0][0] = 2 (0x7ffcff404652-0x7ffcff404650) sizeof(short) = 2
&LArray[0][1] - &LArray[0][0] = 8 (0x7ffcff404728-0x7ffcff404720) sizeof(long) = 8
&CArray[1][0] - &CArray[0][0] = 10 (0x7ffcff4045ea-0x7ffcff4045e0) sizeof(char) * ARRAY_WIDTH = 10
&SArray[1][0] - &SArray[0][0] = 20 (0x7ffcff404664-0x7ffcff404650) sizeof(short) * ARRAY_WIDTH = 20
&LArray[1][0] - &LArray[0][0] = 80 (0x7ffcff404770-0x7ffcff404720) sizeof(long) * ARRAY_WIDTH = 80