对象的C ++向量,空对象创建的内存使用

时间:2013-02-17 10:18:36

标签: c++

C ++ Vector - 它的一部分指向相同的地址

嗨,我的主题可能会令人困惑。

在这里。

我有一个载体

struct node{
int nodeid;
vector<string> data;
vector<fTable> fdata;
}

struct fTable{
int index;
int key;
}

vector<node> myNode;

在某些功能......

void chord::someFunc(int nodeid)
{
    node myTempNode;
    vector<string> data1;
    vector<fTable> fdata1;

    myTempNode.nodeid = nodeid
    myTempNode.data = data1;
    myTempNode.fTable = ftable1;

myNode.push_back(myTempNode);
myTempNode.clear();
}

我将创建10000个对象,此时,我只获得了nodeid的值。

但是对于数据和fTable,我设置了一些空的字符串向量和空的fTable向量,但我想知道我是否创建10000个对象并做同样的事情。

我正在创建10000个空字符串和fTable向量

有没有办法可以将所有这个对象指向同一个字符串向量(空值)和fTable向量(空值),这样我就可以节省一些回忆。考虑到我将或可能创建10000个节点左右。和记忆消耗是我关心的问题。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

不,由于向量是空的,它们不会占用太多空间,也不会创建字符串或fTable对象。

提供有限的c ++知识,我会清楚指出并坚持使用价值观。

您不需要执行任何(立即)跟随,节点的构造函数负责处理。这只是用空向量覆盖空向量。

node myTempNode;
vector<string> data1;
vector<fTable> fdata1;

myTempNode.data = data1;
myTempNode.fTable = ftable1;

如果你给节点一个这样的构造函数:

struct node{
    int node(int id) : nodeid(id) {}
    int nodeid;
    vector<string> data;
    vector<fTable> fdata;
}

然后你只需要写:

myNode.push_back( node(nodeid) );

答案 1 :(得分:0)

是的,然后使用指针向量,即

struct node {
    node(int nid) : nodeid(nid), data(0), fdata(0) { }
    int nodeid;
    vector<string *> data;
    vector<fTable *> fdata;
}

但要注意内存管理:现在删除节点时,不会删除数据和fdata指向的字符串和fTable。如果这些数据在分配后应由节点拥有,请添加析构函数:

struct node {
    node(int nid) : nodeid(nid), data(0), fdata(0) { }
    ~node() {
        for (auto i = data.begin(); i != data.end(); ++i)
            delete *i;
        for (auto i = fdata.begin(); i != fdata.end(); ++i)
            delete *i;
    }
    int nodeid;
    vector<string *> data;
    vector<fTable *> fdata;
}

答案 2 :(得分:0)

创建向量并不总是创建其数据:向量的数据在需要时分配,因此没有数据的向量可能会占用sizeof(std:vector<...>)个字节(如果保留大小为0),以及带有向量的向量数据将实际取sizeof(vector<...>) + n * sizeof(data),其中n是向量中保留项的数量。在我的实现中,向量的大小是28个字节。

第一种方法:vector as fields。拥有矢量字段的优点是它们不是动态分配的,可以避免一堆new/delete手动调用:它更安全。

第二种方法:你也可以像你说的那样使用指针:

struct node
{
    int nodeid;
    vector<string>* data; // pointer
    vector<fTable>* fdata; // pointer
};

您可以将它们设置为0(null),保存向量的大小减去每个节点的指针大小。当你需要一个节点有一个向量时,只需要new一个向量,并设置适当的指针。但是,这种方法最终会占用比前一个更多的空间,因为它也会占用指针的大小。并且您将必须管理删除(可以使用节点析构函数完成,但在节点销毁之前释放向量可能效率较低)。

结论:我建议您估计数据占用的总大小(例如:10000 * ...),看看是否必须使用特定模型(即先测量)。个人而言,我建议你采取第一个(无指针)。

我还建议您为节点使用构造函数(或两个),以获得更好的代码。