我需要减少原生Windows C ++应用程序使用的内存,而不会影响其性能。
我的主要数据结构由以下Line
类的数千个动态分配的实例组成:
struct Properties
{
// sizeof(Properties) == 28
};
// Version 1
class Line
{
virtual void parse(xml_node* node, const Data& data)
{
parse_internal(node, data);
create();
}
virtual void parse_internal(xml_node*, const Data&);
void create();
Properties p;
};
但是因为我注意到我可以摆脱类成员p
,因为我只需要在解析方法中使用它,我改变了Line
实现:
// Version 2
class Line
{
virtual void parse(xml_node* node, const Data& data)
{
Properties p;
parse_internal(node, data, &p);
create(&p);
}
virtual void parse_internal(xml_node*, const Data&, Properties*);
void create(Properties*);
};
这减少了分配的几兆字节的内存,但它将经过的时间增加了50多毫秒。
我想知道这是如何可行的,因为应用程序已针对发布版本进行了全面的速度优化编译。这是因为论证传递了吗?是由于我struct Properties
的堆栈分配?
更新
每个实例只调用一次方法Line::parse
。数据结构由std::vector
Line
组成。多个线程管理此向量的不同子集。
答案 0 :(得分:0)
你写的是parse_internal是递归的。这意味着它在已更改的变体中获得3个参数,而不是原始中的2个参数 - 并且被递归调用几次。
您还必须使用指针语法而不是元素取消引用来访问成员(并且可能验证“属性”指针是否为非null)。要消除指针问题,可以使用parse_internal的引用参数。
是否有理由将parse_internal作为虚拟成员函数,或者您可以将其更改为静态(在修改后的变体中)?