我是机械工程师,所以请理解我没有接受正确的编码培训。我有一个有限元代码,它使用网格来制作构成模型的元素。该元素对这个问题并不重要,因此我省略了。元素和网格从文件中读取,并且该部分正常工作。
class Grid
{
private:
int id;
double x;
double y;
double z;
public:
Grid();
Grid(int, double, double, double);
int get_id() { return id;};
};
Grid::Grid() {};
Grid::Grid(int t_id, double t_x, double t_y double t_z)
{
id = t_id; x = t_x; y = t_y; z = t_z;
}
class SurfaceModel
{
private:
Grid** grids;
Element** elements;
int grid_count;
int elem_count;
public:
SurfaceModel();
SurfaceModel(int, int);
~SurfaceModel();
void read_grid(std::string);
int get_grid_count() { return grid_count; };
Grid* get_grid(int);
};
SurfaceModel::SurfaceModel()
{
grids = NULL;
elements = NULL;
}
SurfaceModel::SurfaceModel(int g, int e)
{
grids = new Grid*[g];
for (int i = 0; i < g; i++)
grids[i] = NULL;
elements = new Element*[e];
for (int i = 0; i < e; i++)
elements[i] = NULL;
}
void SurfaceModel::read_grid(std::string line)
{
... blah blah ...
grids[index] = new Grid(n_id, n_x, n_y, n_z);
... blah blah ....
}
Grid* SurfaceModel::get_grid(int i)
{
if (i < grid_count)
return grids[i];
else
return NULL;
}
当我需要实际使用网格时,可以使用get_grid,如下所示:
SurfaceModel model(...);
.... blah blah .....
for (int i = 0; i < model.get_grid_count(); i++)
{
Grid *cur_grid = model.get_grid(i);
int cur_id = cur_grid->get_id();
}
我的问题是,对get_grid的调用似乎比我认为简单地返回我的对象要花费更多的时间。我在代码上运行了gprof,发现在进行非常大的模拟时,get_grid被调用了约40亿次,并且使用x,y,z进行的另一次操作大致相同。该运算会进行一些乘法。我发现get_grid和数学运算大约花费相同的时间(约40秒)。看来我做错了什么。有没有一种更快的方法可以将物体从那里移出?
我认为您忘记设置grid_count
和elem_count
。
这意味着它们将具有未初始化的(不确定的)值。如果为这些值循环,则可以轻松地结束许多迭代。
SurfaceModel::SurfaceModel()
: grid_count(0),
grids(NULL),
elem_count(0),
elements(NULL)
{
}
SurfaceModel::SurfaceModel(int g, int e)
: grid_count(g),
elem_count(e)
{
grids = new Grid*[g];
for (int i = 0; i < g; i++)
grids[i] = NULL;
elements = new Element*[e];
for (int i = 0; i < e; i++)
elements[i] = NULL;
}
然而,我建议您要摆脱new
该程序中的每个实例(并为网格使用向量)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句