Tag: 计算机体系结构

什么是64位应用程序的内存使用开销?

从我迄今为止发现的情况来看,很明显,针对64位体系结构编译的程序使用的指针的内存是其32位替代方法的两倍 – https://superuser.com/questions/56540/32-bit-vs- 64位系统 。 这是否意味着为64位编译的代码平均使用比32位版本多两倍的内存 ? 我怀疑它,但我想知道真正的开销是什么。 我想在64位体系结构中,像short , byte和char这样的小types是相同的? 虽然我不太确定byte 。 鉴于许多应用程序都使用大型string(如Web浏览器等),大多数实现中都由char数组组成,所以开销可能不会那么大。 所以,即使像int和long这样的数字types在64位上更大,是否会对RAM的使用有重要影响?

alignmentcaching行并知道caching行大小

为了防止错误共享,我想要将数组的每个元素alignment一个caching行。 所以首先我需要知道一个caching行的大小,所以我分配的每个元素的字节数量。 其次我想要数组的开始alignment一个caching线。 我正在使用Linux和8核x86平台。 首先,我如何findcaching行大小。 其次,我如何alignment到C中的caching行。我正在使用gcc编译器。 所以这个结构将会是例子,假设一个高速caching行大小为64。 element[0] occupies bytes 0-63 element[1] occupies bytes 64-127 element[2] occupies bytes 128-191 依此类推,假设0-63与caching线alignment。

为什么64位系统只有48位地址空间?

在一本书中,我读了以下内容: 32位处理器具有2 ^ 32个可能的地址,而当前的64位处理器具有48位地址空间 我的期望是,如果它是一个64位的处理器,地址空间也应该是2 ^ 64。 所以我想知道这个限制的原因是什么?

当空指针不全是零时,如何正确编写C / C ++代码

正如comp.lang.c常见问题解答所说的那样,有一些体系结构的空指针并不全是零。 所以问题是实际检查下面的结构: void* p = get_some_pointer(); if (!p) return; 我比较p与机器相关的空指针或我比较p与算术零? 我应该写吗? void* p = get_some_pointer(); if (NULL == p) return; 而是为这样的架构做好准备,还是只是我的偏执狂?

为什么基于JVM栈和Dalvik VM寄存器?

我很好奇,为什么Sun决定创build基于JVM栈,而Google决定制作基于DalvikVM寄存器的? 我猜想JVM不能真的假定在目标平台上有一定数量的寄存器可用,因为它应该是平台独立的。 因此,它只是推迟寄存器分配等,到JIT编译器。 (如我错了请纠正我。) 所以,Android的人认为,“嘿,这是无效的,让我们立即注册基于VM …”? 但是,等等,有多种不同的Android设备,Dalvik目标有多less个寄存器呢? Dalvik操作码是否针对一定数量的寄存器进行硬编码? 目前市场上所有的Android设备都拥有相同数量的寄存器吗? 或者,是否有在dex-loading期间执行的寄存器重新分配? 这一切如何融合在一起?

每个程序员应该知道的内存?

我想知道,从2007年开始,Ulrich Drepper 每个程序员都应该知道什么内存仍然是有效的。 我也找不到比1.0更新的版本或勘误表。

计算机程序运行时会发生什么?

我知道一般的理论,但我不能适应细节。 我知道一个程序驻留在电脑的辅助存储器中。 一旦程序开始执行,它就完全复制到RAM中。 然后,处理器一次性检索几条指令(取决于总线的大小),将它们放入寄存器并执行。 我也知道一个计算机程序使用两种内存:堆栈和堆,它们也是计算机主内存的一部分。 该堆栈用于非dynamic内存,dynamic内存堆(例如,与C ++中的new运算符相关的所有内容) 我不明白的是这两件事情是如何连接的。 用于执行指令的堆栈在什么位置? 指令从RAM到堆栈,到寄存器?

L1和L2高速caching的行大小

从这个论坛的上一个问题中 ,我了解到,在大多数内存系统中,L1高速caching是L2高速caching的一个子集,意味着从L2中删除的任何条目也将从L1中删除。 所以现在我的问题是如何确定在一级caching中的对应条目在二级caching中的条目。 存储在L2条目中的唯一信息是标签信息。 基于这个标签信息,如果我重新创buildaddr,那么如果L1和L2高速caching的行大小不相同,它可能会跨越L1高速caching中的多行。 体系结构是否真的担心会冲洗这两条线,还是维持相同线宽的L1和L2caching。 我明白这是一个政策决定,但我想知道常用的技术。

malloc可以分配的最大内存

我试图弄清楚我的机器(1GB内存160GB高清Windows平台)可以最大限度地使用malloc。 我读了malloc可以分配的最大内存限于物理内存(在堆上)。 另外,当一个程序超过内存消耗到一定程度,计算机停止工作,因为其他应用程序没有得到足够的内存,他们需要。 所以要确认一下,我用C写了一个小程序: int main(){ int *p; while(1){ p=(int *)malloc(4); if(!p)break; } } 我希望有一段时间,内存分配将失败,循环会中断,但我的电脑挂起,因为它是一个无限循环。 我等了大约一个小时,最后我不得不强行closures我的电脑。 一些问题: malloc是否也从HD分配内存? 上述行为的原因是什么? 为什么在任何时候都没有循环rest? 为什么没有分配失败?

1字节!= 8位的系统?

所有的时候我都像读一样的句子 不要依靠8位大小的1个字节 使用CHAR_BIT而不是8作为常量来转换位和字节 等等。 今天有什么真正的生活系统,这是真实的吗? (我不确定C和C ++之间是否存在差异,或者实际上是否与语言无关,如果需要请重新标记)