Questions tagged «memory»

内存是指用于临时或永久存储程序或数据以在计算机或其他数字电子设备中使用的物理设备。

10
什么时候强制垃圾回收是个好主意?
因此,我正在阅读一个有关强制C#垃圾收集器在几乎每个答案都相同的地方运行的问题:您可以做到,但您不应该这样做-除了一些非常罕见的情况。可悲的是,那里没有人详细说明这种情况。 您能告诉我在哪种情况下强制垃圾回收实际上是一个好主意吗? 我不是在询问C#的特定情况,而是询问所有具有垃圾收集器的编程语言。我知道您不能在所有语言(例如Java)上强制使用GC,但让我们假设可以。

15
何时针对一种方法优化内存与性能速度?
我最近在亚马逊接受了采访。在编码会议期间,面试官问为什么我在方法中声明了变量。我解释了我的过程,他挑战我以更少的变量解决相同的问题。例如(这不是从采访),我开始与方法A然后提高它方法B,通过去除int s。他很高兴,并说这将通过这种方法减少内存使用。 我了解其背后的逻辑,但我的问题是: 什么时候适合使用方法A与方法B,反之亦然? 您可以看到,由于方法A被int s声明了,因此它将具有更高的内存使用率,但是它只需执行一次计算即可,即a + b。另一方面,方法B的内存使用量较低,但是必须执行两次计算,即a + b两次。什么时候比另一种使用一种技术?还是其中一种技术总是总是比其他技术更受青睐?评估这两种方法时要考虑什么? 方法A: private bool IsSumInRange(int a, int b) { int s = a + b; if (s > 1000 || s < -1000) return false; else return true; } 方法B: private bool IsSumInRange(int a, int b) { if (a + b …

6
Java中的堆栈和堆内存
据我了解,在Java中,堆栈内存保存了原语和方法调用,而堆内存则用于存储对象。 假设我有一堂课 class A { int a ; String b; //getters and setters } a类中的基元A将存储在哪里? 为什么堆内存根本存在?为什么我们不能将所有内容都存储在堆栈中? 当对象被垃圾回收时,与对象相关联的堆栈是否被破坏?

6
当大多数情况下建议使用双精度时,为什么浮点数仍是Java语言的一部分?
在我所见过的每个地方,它都说在几乎所有方面double都优于float。在Java中float已经过时了double,为什么仍要使用它呢? 我用Libgdx编写了很多程序,它们迫使您使用float(deltaTime等),但是在我看来double,就存储和内存而言,使用起来更容易。 我还读了什么时候使用float以及什么时候使用double,但是如果float真的只对小数点后有很多数字的数字有用,那为什么我们不能仅使用的多种变体之一double? 关于人们为什么仍然坚持使用浮点数,即使它实际上不再具有任何优势,是否有任何理由呢?改变这一切只是太多的工作吗?

11
您处理过空间强化了吗?
我非常渴望学习有关空间硬化的最佳实践。例如,我已经读到(尽管我再也找不到该文章了)火星漫游者的某些核心部分没有使用动态内存分配,实际上这是被禁止的。我还读到老式的核心内存在空间上可能更可取。 我当时在研究与Google Lunar Challenge相关的一些项目,想知道将代码登上月球甚至进入太空的感觉如何。我知道在这样恶劣的环境下,空间加固板可以提供一些理智,但是我想知道(作为C程序员)如果我要编写可以在空间中运行的东西,我该如何调整思维和代码? 我认为未来几年私人太空公司可能会显示出更多的增长,我真的希望至少对最佳实践有所了解。 如果辐射,冷或热轰击了一块对其绝缘造成破坏的电路板,该程序会怎样?我认为目标是将人类留在航天器内(就固定或交换东西而言),避免执行固定任务。 此外,如果董事会维护一些关键系统,则预警似乎至关重要。 一个人如何通过测试和反复试验获得经验(除非发射自己的个人卫星?)
62 c  memory 

6
为什么CPU缓存如此之快?
是什么使CPU高速缓存内存比主内存快得多?我可以看到分层缓存系统有一些好处。较小的缓存可以更快地进行搜索是有意义的。但是必须有更多的东西。
58 memory  caching 

5
吃豆人游戏中的“ 256级错误”可以被视为未处理的段错误吗?
我试图向某人解释分段错误,并且我正在考虑吃豆子中的256级杀伤屏幕,整数溢出是如何触发的,以及该行为与分段中经常描述的“未知状态”有多相似故障。 我想说的是这是我所谓的“未处理的段错误”的一个很好的例子,但是在我可能散布错误信息之前,我宁愿先获得第二意见。 我尝试查找它,但我得到的只是有关错误本身的文档,以及Hipster Whale和Namco之间的协作。 因此,您是否认为Pacman级别256中的行为是未处理的细分违规的示例?
51 memory  errors 

3
为什么我们仍然向后增加堆栈?
编译C代码并查看汇编时,所有的堆栈都像这样向后生长: _main: pushq %rbp movl $5, -4(%rbp) popq %rbp ret -4(%rbp)-这是否意味着基本指针或堆栈指针实际上是向下移动内存地址而不是向上移动?这是为什么? 我换$5, -4(%rbp)到$5, +4(%rbp),编译和运行代码并没有任何错误。那么,为什么我们还必须在内存堆栈上倒退呢?
46 c  memory  assembly 

4
空值存储在哪里,或者根本存储在哪里?
我想了解空值或空引用。 例如,我有一个名为Apple的类,并创建了它的一个实例。 Apple myApple = new Apple("yummy"); // The data is stored in memory 然后我吃了那个苹果,现在它需要为空,因此我将其设置为空。 myApple = null; 打电话之后,我忘记了吃了它,现在想检查一下。 bool isEaten = (myApple == null); 通过此调用,myApple在哪里引用?null是一个特殊的指针值吗?如果是这样,如果我有1000个空对象,如果我们认为指针类型为int的话,它们会占用1000个对象存储空间还是1000个int存储空间?
39 memory  null 

8
在C ++中,程序员花了多少时间进行内存管理
习惯于垃圾回收语言的人通常会害怕C ++的内存管理。有工具,如auto_ptr和shared_ptr将处理许多适合你的存储管理任务。许多C ++库早于这些工具,并拥有自己的方式来处理内存管理任务。 您花多少时间执行内存管理任务? 我怀疑它在很大程度上取决于您使用的库集,因此请说出您的答案适用于哪些库,以及它们的优劣之处。
39 c++  memory 

10
变量和存储位置有什么区别?[关闭]
最近,我一直在尝试以视觉方式将指针解释为抽认卡。 问题001:这是计算机内存中某个位置的图形。它的地址是真的0x23452吗?为什么? 答:是的,因为0x23452描述了计算机可以在哪里找到此位置。 问题002:字符b存储在存储单元中是否正确0x23452?为什么? 答:不,因为字符a实际上存储在其中。 问题003:指针存储在存储单元中是否正确0x23452?为什么? 答:是的,因为存储位置的地址0x34501存储在其中。 问题004:指针是否存储在存储单元内是否正确0x23452?为什么? 答:是的,因为另一个存储位置的地址存储在其中。 现在,让我担心的部分。一位软件工程师这样向我解释了一些建议: 指针是一个变量,其值是另一个变量的内存地址。 根据我向大家展示的四个抽认卡,我将以略有不同的方式定义指针: 指针是一个存储位置,其值是另一个存储位置的存储地址。 可以肯定地说变量与存储位置相同吗? 如果没有,那么谁是对的?变量和存储位置有什么区别?

1
面向单分配ADT的代码在现代CPU上的性能
可以推论,使用单一分配处理不可变数据具有明显的效果,那就是需要更多的内存,因为您一直在创建新的值(尽管在幕后的编译器会做一些指针技巧来解决这一问题)。 但是,我现在已经听到几次,性能方面的损失被CPU(特别是其内存控制器)可以利用内存未发生突变(这种情况不多)这一事实带来的收益所抵消。 我希望有人可以阐明这是如何做到的(或者如果不是的话)。 在另一篇文章的评论中,有人提到抽象数据类型(ADT)与此有关,这使我更加好奇,ADT如何特别影响CPU处理内存的方式?不过,这是一个问题,主要是我只是对语言的纯洁度如何必然影响CPU及其缓存的性能等感兴趣。

5
如果数字太大,会溢出到下一个存储位置吗?
我一直在审查C编程,但有几件事困扰着我。 让我们以以下代码为例: int myArray[5] = {1, 2, 2147483648, 4, 5}; int* ptr = myArray; int i; for(i=0; i<5; i++, ptr++) printf("\n Element %d holds %d at address %p", i, myArray[i], ptr); 我知道一个int可以容纳正数2,147,483,647的最大值。因此,通过遍历它,是否“溢出”到下一个内存地址,从而导致元素2在该地址处显示为“ -2147483648”?但这并没有真正的意义,因为在输出中它仍然说下一个地址保持值为4,然后是5。如果该数字已溢出到下一个地址,则不会改变存储在该地址的值? 我隐约记得在MIPS Assembly中进行编程时,看着地址在程序执行过程中逐步改变了值,分配给这些地址的值会改变。 除非我没有记错,否则这是另一个问题:如果分配给特定地址的数字大于类型(如myArray [2]中的类型),那么它是否不影响存储在后续地址中的值? 示例:我们在地址0x10010000处有int myNum = 40亿。当然,myNum不能存储40亿,因此它在该地址显示为负数。尽管不能存储这么大的数字,但它对存储在后续地址0x10010004上的值没有影响。正确? 内存地址仅具有足够的空间来容纳某些大小的数字/字符,如果大小超出限制,则其表示方式将有所不同(例如尝试将40亿存储到int中,但它将显示为负数),并且因此,它不会影响下一个地址中存储的数字/字符。 对不起,如果我过分。从那以后,我整天都在闹大闹鬼。

2
为什么C字符串文字是只读的?
字符串文字为只读的优点是(-ies / -ied): 另一种射击自己的方式 char *foo = "bar"; foo[0] = 'd'; /* SEGFAULT */ 无法优雅地初始化一行中的可读写单词数组: char *foo[] = { "bar", "baz", "running out of traditional placeholder names" }; foo[1][2] = 'n'; /* SEGFAULT */ 使语言本身复杂化。 char *foo = "bar"; char var[] = "baz"; some_func(foo); /* VERY DANGEROUS! */ some_func(var); /* …
29 c  memory  strings 

8
是否可以静态地预测何时仅从源代码中释放内存?
在程序执行期间,确定性的时间将内存(和资源锁)返回给OS。程序本身的控制流足以知道可以在哪里释放给定资源。就像人类程序员fclose(file)在程序完成后如何知道在哪里写一样。 GC通过在执行控制流时在运行时直接解决问题来解决此问题。但是,有关控制流的真实性的真正来源是来源。因此,从理论上讲,应该可以free()通过分析源(或AST)来确定在编译之前将调用插入到哪里。 引用计数是实现此目的的一种明显方法,但是很容易遇到仍然引用指针(仍在范围内)但不再需要指针的情况。这只是将手动分配指针的职责转换为手动管理这些指针的作用域/引用的职责。 似乎可以编写一个可以读取程序源代码的程序,并且: 预测程序控制流的所有排列-达到与观看程序实时执行类似的准确性 跟踪所有对分配资源的引用 对于每个引用,遍历整个后续控制流,以找到保证绝对不会取消引用的最早点 在这一点上,在源代码的那一行插入一个delocation语句 那里有什么已经做到了吗?我不认为Rust或C ++智能指针/ RAII是同一回事。
27 parsing  memory 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.