我今天刚上课了 - 阅读C代码和输入,如果程序实际运行,所需答案就是屏幕上显示的内容.其中一个问题被声明a[4][4]
为一个全局变量,并且在该程序的一个点上,它试图访问a[27][27]
,所以我回答了类似" 访问一个超出其边界的数组是一个未定义的行为 ",但老师说它a[27][27]
的值将为0
.
之后,我尝试了一些代码来检查"所有未初始化的golbal变量是否设置为0
"是否为真.好吧,这似乎是真的.
所以现在我的问题是:
a[27][27]
是0
所有环境?编辑:
在该代码中,a[4][4]
是唯一声明的全局变量,并且还有一些更多本地变量main()
.
我在DevC++中再次尝试了该代码.所有这些都是0
.但在VSE中并非如此,其中大多数值都是,0
但有些值具有Vyktor指出的随机值.
在"低级编程:英特尔®64架构上的C,汇编和程序执行"一书中,我读到:
每个虚拟64位地址(例如,我们在程序中使用的地址)由几个字段组成.地址本身实际上只有48位宽; 它被符号扩展为64位规范地址.它的特点是它的17个左位是相等的.如果不满足条件,则在使用时立即拒绝该地址.然后借助特殊表将48位虚拟地址转换为52位物理地址.
为什么虚拟地址和物理地址之间的差异为4位?
assembly memory-management virtual-memory memory-address mmu
我在Debian OS上运行一个带递归调用的程序.我的堆栈大小是
-s: stack size (kbytes) 8192
Run Code Online (Sandbox Code Playgroud)
据我所知,堆栈大小必须是固定的,并且必须与每次运行时必须分配给程序的相同,除非明确更改它ulimit
.
递归函数是递减给定的数字,直到达到0
.这是用Rust写的.
fn print_till_zero(x: &mut i32) {
*x -= 1;
println!("Variable is {}", *x);
while *x != 0 {
print_till_zero(x);
}
}
Run Code Online (Sandbox Code Playgroud)
并且值传递为
static mut Y: i32 = 999999999;
unsafe {
print_till_zero(&mut Y);
}
Run Code Online (Sandbox Code Playgroud)
由于分配给程序的堆栈是固定的,理论上不能改变,我每次都希望堆栈溢出的值相同,但不是,这意味着堆栈分配是可变的.
运行1:
====snip====
Variable is 999895412
Variable is 999895411
thread 'main' has overflowed its stack
fatal runtime error: stack overflow
Run Code Online (Sandbox Code Playgroud)
运行2:
====snip====
Variable is 999895352
Variable is 999895351
thread 'main' has overflowed its stack
fatal …
Run Code Online (Sandbox Code Playgroud) 英特尔手动优化(2019 年 9 月修订版)显示了用于 Ice Lake 微架构的 48 KiB 8 路关联 L1 数据缓存。
这让我感到困惑,因为:
总而言之,缓存的处理成本似乎更高,但延迟仅略有增加(如果确实如此,则取决于英特尔对该数字的确切含义)。
有一点创造力,我仍然可以想象一种快速索引 96 组的方法,但第二点对我来说似乎是一个重要的突破性变化。
我错过了什么?
我们在Linux机器上运行了大约10个Python进程,它们都读取相同的大型数据结构(恰好是Pandas DataFrame
,本质上是2D numpy矩阵).
这些进程必须尽快响应查询,并且将数据保存在磁盘上的速度根本不足以满足我们的需求.
我们真正需要的是所有进程都可以完全随机访问内存中的数据结构,因此它们可以检索执行任意计算所需的所有元素.
由于其大小,我们无法在内存中复制数据结构10次(甚至两次).
有没有办法让所有10个Python进程可以共享对内存中数据结构的随机访问?