这个问题可能很愚蠢,但我不完全理解事件处理程序在幕后是如何工作的。例如,当文件更改或 JavaScript 中的浏览器事件时调用的函数。对于所有这些,都有可以使用的现成工具,但是这些工具是如何实现的,例如,文件更改时的相同事件。据我所知,首先想到的方法while (true)
很糟糕,原则上您必须添加最小延迟,以免处理器过载,但不知何故,他们能够实现不加载处理器的事件,并且立即开火。您能否解释一下这是如何在低级别实施的或分享相关来源?
主页
/
user-564767
hello world's questions
我曾经认为当我们创建像这样的多维数组时
int arr[2][3] =
{
{1, 2, 3},
{1, 2, 3}
}
内存中分配了两个单元,每个单元都占用sizeof(int) * 3
,因此您可以轻松访问任何元素。例如,当访问最后三个时arr[1][2]
,在指针级别它将如下所示*(arr + (sizeof(int) * 3 * 1) + 2)
。嗯,这样的数组正好占用 2x3 内存。
但后来我在指针层面看到了这样的公式arr[1][2] => *(*(arr + 1) + 2)
,得出的结论是,多维数组在内存中存储如下(这里我将这样表示内存0[5]
,其中0
是单元格地址[5]
, 是存储在单元格内部的值): 0[адрес 2], 1[адрес 5], 2[1], 3[2], 4[3], 5[1], 6[2], 7[3]
. 通过这样的存储,您可以轻松理解为什么*(*(*(arr + i) + j) + k)
在每个级别的该公式中都会发生取消引用。然而,采用这种存储方式,同一个数组已经占用了2+2x3。
既然存储的是多维数组,如果我描述的第二种方法是正确的,那么它比第一种方法有什么优势呢?