草庐IT

c# - 引用类型存在于堆中,值类型存在于栈中

在阅读“深入了解C#”时,我浏览了标题为“引用类型存在于堆中,值类型存在于堆栈中”的部分。现在我能理解的是(主要针对ref类型):classProgram{inta=5;//storedinheappublicvoidAdd(intx,inty)//x,ystoredinstack{intc=x+y;//cstoredinstack}}只是想澄清一下我的假设是否正确。谢谢。编辑:我应该使用diff变量,因为我认为我最初造成的困惑。所以我修改了代码。编辑:是的,正如乔恩提到的那样-这是一个神话。我应该提到这一点。抱歉。 最佳答案 ht

java - 为什么引用类型存储在堆中

我确实知道在Java中(也许在.net中也是如此),基元存储在堆栈中,而引用类型存储在堆中。我的问题是我不了解此行为的过程/缺点。为什么我们不能引用堆栈中的内存位置呢?.我在谷歌上搜索时找不到合适的解释(也许我很烂),但如果你们能提供一些见解,我将不胜感激谢谢。 最佳答案 IdoknowthatinJava,(perhapsin.nettoo),primitivesarestoredonstacks,whereasreferencetypesarestoredonheaps.没有。它不取决于它是原语还是引用。使用栈还是堆取决于作用域

java - 什么是堆中的并发标记-清除生成?

在下面的输出中,什么是并发标记清除生成?parnewgenerationtotal24512K,used12082K[0x00007fb3b9420000,0x00007fb3bac20000,0x00007fb3bac20000)edenspace24448K,49%used[0x00007fb3b9420000,0x00007fb3b9fec808,0x00007fb3bac00000)fromspace64K,0%used[0x00007fb3bac10000,0x00007fb3bac10000,0x00007fb3bac20000)tospace64K,0%used[0x00

java - ConcurrentLinkedQueue$Node 在 remove() 之后保留在堆中

我有一个写入和读取ConcurrentLinkedQueue的多线程应用程序,它在概念上用于支持列表/表中的条目。我最初为此使用了ConcurrentHashMap,效果很好。一项新要求需要跟踪进入的订单条目,因此可以根据某些条件以最旧的顺序删除它们。ConcurrentLinkedQueue似乎是一个不错的选择,而且在功能上它运行良好。可配置数量的条目保存在内存中,当达到限制时提供新条目时,将以最早的优先顺序搜索队列以查找可以删除的条目。某些条目不会被系统删除并等待客户端交互。似乎正在发生的事情是我在发生的队列前面有一个条目,比如100K条目之前。该队列似乎配置的条目数量有限(siz

java - 无法访问的对象不是从堆中收集的垃圾

我正在为我的JVM堆(Java1.7)中无法访问的对象而苦苦挣扎。从图中可以看出(图中所有类都是不可达的),我们有超过74%的objects没有reference,所以应该是garbaggedcollected。在我们的tomcat7服务器上正常运行3周后,该状态变为仅运行Probe监控应用程序、tomcat管理器和我们的web应用程序,这可能是问题的根源。我们的应用程序基于JSF1.2,在客户端上保存状态,这就是您在下图中看到的-主要是带有ViewSaveState的字符数组。当我从jVisualVM手动运行GC时,它会删除所有无法访问的对象,一切正常,直到堆达到其限制的3周。有些对

c++ - 利用 vector 的元素存储在堆中的事实?

假设你有这样的东西#include#includeusingnamespacestd;vectortest(){vectorx(1000);for(inti=0;ia=test();return0;}在函数中创建一个vector并用一些元素填充它(在本例中我选择了12345,但它们不一定都相同)。我读到vector的元素存储在堆中,而引用和header数据存储在堆栈中。在上面的代码中,当返回x时,必须调用复制构造函数,这需要O(n)时间将所有元素复制到一个新vector中。但是,是否可以利用所有元素都已存在于堆中这一事实,以便只返回指向这些元素的指针之类的东西,然后创建一个使用该指针指

c++ - 放置在 unordered_map 中的项目是存储在堆栈还是堆中?

假设我有以下类(class):classMyOtherClass{std::unordered_map>_xy;voidputObject(intx,inty,MyClass*obj);voidcontainsXkey(intx){boolfound=false;std::unordered_map>::const_iteratorindex=_xy.find(x);if(index=_xy.end(){found=false;}else{found=true;}returnfound;}}假设我想编写一个函数将MyClass放置在坐标(2,3)处,那么我会这样做:voidputObj

c++ - 如何更改 C++ 标准库中堆中的最大元素?

如果我有一个最大堆,并且如果我需要更改最大元素,则归结为单个向下冒泡算法。有什么方法可以通过C++标准库实现这一点,而无需手动编写算法代码?我理解它应该等同于pop_heap+push_heap,但这是2个冒泡操作而不是一个。那么-这种向下冒泡算法是通过库API公开的吗? 最佳答案 如果你愿意在你自己的容器v上调用std::pop_heap(),那么你可以先v.push_back()在弹出堆之前容器上的“修改”元素。然后,收缩v。//Preconditionisthatvisalreadyaheap.voidchange_max_e

在堆中或堆栈中创建构造函数有什么区别?

这是一个基本示例myclass*abc=newmyclass()和myclassabc有什么区别?在两种情况下,都是对象abc在堆栈中创建?如果对象是在堆中创建的,那么有什么不同?从答案中,我采取的(如果不正确,请编辑):构造函数初始化类(成员)如果我们希望当类不在范围内时不会删除类的变量,则应将对象创建堆积。看答案虽然在这两种情况下abc在自动内存中(通常称为“堆栈”),它不是相同的对象:在第一个示例中abc是一个指针,存储在堆栈上。但是,有第二个类型的对象myclass存储在动态内存中(通常称为“堆”)。对象指针abc指向堆中的对象。在第二个示例中abc是类型myclass。这是正在创建的

c++ - 从 vc++ 调用存储在堆中的代码

假设我正在做这样的事情:void*p=malloc(1000);*((char*)p)=some_opcode;*((char*)p+1)=another_opcode;//forthesakeoftheexample:theopcodesareok....etc...我怎样才能定义一个函数指针来调用p就好像它是一个函数一样?(我正在使用VC++2008Express)。谢谢 最佳答案 评论空间不足。Joe_Muc是正确的。您不应该将代码填充到通过malloc或new获得的内存中。如果您更改Windows分配的页面的页面属性,您将遇