相关疑难解决方法(0)

访问绑定的未定义行为之外的全局数组?

我今天刚上课了 - 阅读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指出的随机值.

c undefined-behavior

60
推荐指数
7
解决办法
3235
查看次数

为什么在64位虚拟地址与物理地址(52位长)相比,4位短(48位长)?

在"低级编程:英特尔®64架构上的C,汇编和程序执行"一书中,我读到:

每个虚拟64位地址(例如,我们在程序中使用的地址)由几个字段组成.地址本身实际上只有48位宽; 它被符号扩展为64位规范地址.它的特点是它的17个左位是相等的.如果不满足条件,则在使用时立即拒绝该地址.然后借助特殊表将48位虚拟地址转换为52位物理地址.

为什么虚拟地址和物理地址之间的差异为4位?

assembly memory-management virtual-memory memory-address mmu

12
推荐指数
1
解决办法
2304
查看次数

为什么在每次运行而不是固定数量的堆栈使用量不同时发生堆栈溢出?

我在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)

c linux stack-overflow out-of-memory rust

9
推荐指数
1
解决办法
280
查看次数

Ice Lake 的 48KiB L1 数据缓存的索引是如何工作的?

英特尔手动优化(2019 年 9 月修订版)显示了用于 Ice Lake 微架构的 48 KiB 8 路关联 L1 数据缓存。

Ice Lake 的 48KiB L1 数据缓存及其 8 路关联性 1软件可见的延迟/带宽会因访问模式和其他因素而异。

这让我感到困惑,因为:

  • 有 96 组(48 KiB / 64 / 8),不是二的幂。
  • 集合的索引位和字节偏移的索引位相加超过 12 位,这使得4KiB 页面无法使用便宜的 PIPT-as-VIPT-trick

总而言之,缓存的处理成本似乎更高,但延迟仅略有增加(如果确实如此,则取决于英特尔对该数字的确切含义)。

有一点创造力,我仍然可以想象一种快速索引 96 组的方法,但第二点对我来说似乎是一个重要的突破性变化。

我错过了什么?

x86 intel cpu-architecture cpu-cache micro-architecture

7
推荐指数
2
解决办法
234
查看次数

在Python进程中共享内存中的大型数据结构?

我们在Linux机器上运行了大约10个Python进程,它们都读取相同的大型数据结构(恰好是Pandas DataFrame,本质上是2D numpy矩阵).

这些进程必须尽快响应查询,并且将数据保存在磁盘上的速度根本不足以满足我们的需求.

我们真正需要的是所有进程都可以完全随机访问内存中的数据结构,因此它们可以检索执行任意计算所需的所有元素.

由于其大小,我们无法在内存中复制数据结构10次(甚至两次).

有没有办法让所有10个Python进程可以共享对内存中数据结构的随机访问?

python architecture performance numpy pandas

4
推荐指数
1
解决办法
960
查看次数