如何为三维矢量中未使用的元素释放内存
How can I free memory for unused elements in 3D vectors?
我生成了100*100*500向量(或者说数组)。我随机填充元素。某些元素保持为空。我可以为未使用的元素释放内存吗。或者,矢量数据结构已经做到了?
感谢
不能释放数组中单个元素占用的内存。数组作为连续内存块进行分配和释放。您可以考虑将数据存储在链表中,以实现该功能。如果你的问题是关于节省内存,我会想到稀疏向量。
编辑:既然我们已经澄清了(在评论部分),你的目标是存储和图形化地表示一组给定的三维数据,我可以想出一个更详细的答案:
稀疏存储三维数据的常用方法是八叉树。为了与某种体素引擎一起使用,八叉树可以很容易地实现如下:
enum AtomType
{
NoType,
SolidType,
StrangeType
};
class OctreeNode
{
public:
virtual OctreeNode* getSubNode(unsigned index) = 0;
virtual AtomType getContent(void) = 0;
};
class OctreeBranchNode : public OctreeNode
{
public:
OctreeNode* getSubNode(unsigned index)
{
if (subNodes) return subNodes[index]; else return nullptr;
}
AtomType getContent(void) { return NoType; }
private:
OctreeNode** subNodes;
};
class OctreeAtomNode : public OctreeNode
{
public:
OctreeNode* getSubNode(unsigned index) { return nullptr; }
AtomType getContent(void) { return content; }
private:
AtomType content;
};
关键是,您不需要以这种方式存储坐标,因为每个节点的三维位置在树层次结构中的位置是清晰的。
如果你想真正渲染你的数据集,你可能想尝试行进立方体,甚至把每个原子都渲染成一个立方体盒子(数据集是否足够大,因此原子是否很小也没关系)。还有一个关于如何编写基于OpenGL的体素引擎的好教程。
取决于保存在数组中的元素的大小。。。您可以使用指针数组并将所有元素设置为nullptr/NULL。因此,您可以使用new操作符在堆上创建新元素。但是,如果元素和指针本身一样小,那么这种解决方案是毫无意义的。
如果您使用的是std::vector
,"100*100*500"表示"容量为5000000的矢量",请注意,std::vector
容器提供了快速索引和直接数据访问,因为所有数据都存储在一个内存块中。在c++中,你可以写这样的东西:
int* arr = new int[5];
arr[0] = 1;
arr[4] = 5;
在本例中,我们有一个容量为5的数组,但第1、第2和第3个元素仍然未使用,但无法释放已分配但仍然未使用的内存。您还可以创建一个容量为2的新阵列,然后将所有元素复制到新阵列中,然后删除初始阵列。以下是std::vector
的工作原理。在c++11中,您也可以使用std::vector::shrink_to_fit()
,但这并不能解决您的问题,因为std::vector::shrink_to_fit()
不会压缩数组,只是从向量的后面删除未使用的内存分配。
- 普通环路未使用gcc 4.8.5自动矢量化
- 在更改for循环的第三部分后,未使用for循环结果
- 使用typeid警告未使用的变量
- C++删除未使用的类属性会导致 std::logic_error
- 警告 C4552:">>":未使用表达式的结果
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 可视化C++载体:未使用的容量
- GCC 中 __attribute__((未使用)) 和 __attribute((未使用)) 之间的区别
- 循环访问还包含未使用元素的字符串数组
- Q维德格特关闭事件(..)未使用 QProcess::terminate() 调用
- Visual Studio "fatal error LNK1104: cannot open file"未使用或包含的库
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 链接器输入文件未使用,因为链接未完成,我无法获得.o
- 未使用的C++未优化的静态成员函数/变量
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 如何控制或优化或删除或释放 UNION 中未使用的内存
- 将未使用的元素添加到C/C 结构加快并减慢代码执行
- 如何为三维矢量中未使用的元素释放内存