有没有人知道我怎么能在平台无关的C++代码中阻止在堆上创建对象?也就是说,对于"Foo"类,我想阻止用户这样做:
Foo *ptr = new Foo;
Run Code Online (Sandbox Code Playgroud)
并且只允许他们这样做:
Foo myfooObject;
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法?
干杯,
Haskell没有显式内存管理功能,所有对象都是按值传递的,所以也没有明显的引用计数或垃圾回收.Haskell编译器通常如何决定是否生成在堆栈上分配的代码与在堆上为给定变量分配的代码?是否一致堆或堆栈为同一个函数在不同的调用站点分配相同的变量?当它分配时,它如何决定何时释放内存?堆栈分配和解除分配是否仍在与C中相同的功能入口/出口模式中执行?
假设我们有4个课程如下:
class A
{
public:
A(void) : m_B()
{
}
private:
B m_B;
}
class B
{
public:
B(void)
{
m_i = 1;
}
private:
int m_i;
}
class C
{
public:
C(void)
{
m_D = new D();
}
~C(void)
{
delete m_D;
}
private:
D *m_D;
}
class D
{
public:
D(void)
{
m_i = 1;
}
private:
int m_i;
}
Run Code Online (Sandbox Code Playgroud)
可以说有4种情况:
情况1:在堆栈上外部分配,B在堆栈内部分配
A myA1;
Run Code Online (Sandbox Code Playgroud)
情况2:在堆上外部分配,B内部分配在堆栈上
A *myA2 = new A();
Run Code Online (Sandbox Code Playgroud)
情况3:C在堆栈外部分配,D在堆内部分配
C myC1;
Run Code Online (Sandbox Code Playgroud)
情况4:C在堆上外部分配,D在堆内部分配
C *myC2 = new …Run Code Online (Sandbox Code Playgroud) 我正在阅读关于这个答案的评论,我看到了这个引用.
对象实例化和面向对象的特性使用起来非常快(在许多情况下比C++更快)因为它们从一开始就被设计出来.和收藏很快.标准Java在该领域击败标准C/C++,即使对于大多数优化的C代码也是如此.
一个用户(我可能会添加很高的代表)大胆地为这个说法辩护,说明这一点
java中的堆分配比C++好
并添加此语句来保护java中的集合
由于内存子系统不同,Java集合与C++集合相比也很快.
所以我的问题是,任何这些都是真的,如果是这样,为什么java的堆分配要快得多.
似乎优先级队列只是具有正常队列操作的堆,如insert,delete,top等.这是解释优先级队列的正确方法吗?我知道您可以以不同的方式构建优先级队列但是如果我要从堆构建优先级队列,则需要创建优先级队列类并提供构建堆和队列操作的说明,或者是否真的不需要构建班级?
我的意思是如果我有一个函数来构建一个堆和函数来执行像insert,delete这样的操作,我是否需要将所有这些函数放在一个类中,或者我可以通过调用它们来使用它们main.
我想我的问题是,拥有一组函数是否等同于将它们存储在某个类中并通过类或仅使用函数本身来使用它们.
我下面是优先级队列实现的所有方法.这足以称之为实现,还是需要将其置于指定的优先级队列类中?
#ifndef MAX_PRIORITYQ_H
#define MAX_PRIORITYQ_H
#include <iostream>
#include <deque>
#include "print.h"
#include "random.h"
int parent(int i)
{
return (i - 1) / 2;
}
int left(int i)
{
if(i == 0)
return 1;
else
return 2*i;
}
int right(int i)
{
if(i == 0)
return 2;
else
return 2*i + 1;
}
void max_heapify(std::deque<int> &A, int i, int heapsize)
{
int largest;
int l = left(i);
int r = right(i);
if(l <= heapsize && A[l] …Run Code Online (Sandbox Code Playgroud) 我有一个6.5GB的Hprof文件,使用该-XX:-HeapDumpOnOutOfMemoryError选项由64位JVM转储.我把它放在一台16GB的64位机器上,并且我试图将它放入jhat,但它一直在耗尽内存.我试过传递jvm args以获得最小设置,但它拒绝任何最小值,并且在达到最大值之前似乎耗尽了内存.
jvm耗尽内存会使堆积如此之大以至于无法将其加载到具有两倍ram的盒子上,这似乎有点愚蠢.有没有办法让这个运行,或可能摊销分析?
如何从方法调用中获取对象值作为结果并将其放在堆上?
例如:
Qt QImage::scaledToWidth方法返回QImage对象的副本.
现在我正在做:
QImage *new_img_on_heap = new QImage(old_imgage_on_heap->scaledToWidth(2000));
Run Code Online (Sandbox Code Playgroud)
这是唯一的方法吗?看起来它已经经历了制作第三个全新物体的麻烦,当我已经在堆栈上有一个完美的好物品时.
我想把它放在堆上的原因是因为真实QImage的很大,我希望它比当前方法的生命周期更长.我打算在我班上的一个字段中填充指针.
我知道QImage有一些隐含的数据共享,但我并不清楚它是如何工作的.另外,我想知道一个通用的解决方案,如果我需要使用不像Qt那样精心设计的对象.
我总是假设堆(数据结构)用于实现堆(动态内存分配),但我被告知我错了.
通常情况下,如何实现堆(例如,通过典型malloc例程或Windows 实现的堆HeapCreate)?他们使用什么数据结构?
在线搜索时,我已经看到了大量关于如何实施严格限制的堆的描述.
仅举几例,我已经看到了很多关于如何实现的描述:
而这很有趣,他们都避开更难的问题:
如何是"正常"的,通用的堆(如一个在后面malloc,HeapCreate)来实现?
他们使用什么数据结构(可能还有算法)?
我通常对jvm堆大小做的是将max值设置得非常高,以避免臭名昭着的OutOfMemoryException.
然而,这种策略(或缺乏策略)似乎并不是很聪明.:-).
我的问题是如何选择最小值和最大值,以及两者之间的差异(最大值应该是小还是大?).例如,从这里:
如果初始堆太小,Java应用程序启动变慢,因为JVM被迫频繁执行垃圾收集,直到堆增长到更合理的大小.为获得最佳启动性能,应将初始堆大小设置为与最大堆大小相同.
谢谢.
heap ×10
c++ ×5
stack ×4
java ×3
algorithm ×2
jvm ×2
collections ×1
haskell ×1
jhat ×1
memory ×1
memory-leaks ×1
merge ×1
performance ×1