下面是我的代码。
Point3* LASReader::GetPoint(int index)
{
if (m_index == m_header.NPointRecords)
return 0;
stream.seekg(GetOffset(index));
m_index++;
LASPOINTF1 p0;
LASPOINTF1 p1;
LASPOINTF2 p2;
LASPOINTF3 p3;
LASPOINTF4 p4;
LASPOINTF5 p5;
Vector3 position;
// Get the point values
switch (m_header.PointDataFormat)
{
case 0:
stream.read((char *)&p0, sizeof(LASPOINTF0));
position = Vector3(p0.X, p0.Y, p0.Z);
break;
case 1:
stream.read((char *)&p1, sizeof(LASPOINTF1));
position = Vector3(p1.X, p1.Y, p1.Z);
break;
case 2:
stream.read((char *)&p2, sizeof(LASPOINTF2));
position = Vector3(p2.X, p2.Y, p2.Z);
break;
case 3:
stream.read((char *)&p3, sizeof(LASPOINTF3));
position = Vector3(p3.X, p3.Y, p3.Z);
break;
case 4:
stream.read((char *)&p4, sizeof(LASPOINTF4));
position = Vector3(p4.X, p4.Y, p4.Z);
break;
case 5:
stream.read((char *)&p5, sizeof(LASPOINTF5));
position = Vector3(p5.X, p5.Y, p5.Z);
break;
}
// Calculate the real coordinates of the point
position = position * *m_scale + *m_offset;
return new Point3(position.GetX(), position.GetY(), position.GetZ());
}
// Main
int main()
{
VertexPosColF* pcmVertices = new VertexPosColF[reader->GetHeader().NPointRecords];
while (!reader->AllPointsRead())
{
pcmVertices[i].Position = reader->GetPoint()->GetPosition()->GetD3DXVECTOR3();
pcmVertices[i].Color = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f);
i++;
}
}这就是我的问题。我正在使用像GetFromFile()这样的方法读取一个文件(我知道这还不够,但这只是一个示例),也许我调用了它上百万次,所以if else条件运行了上百万次。我希望在调用方法之前调用它一次。如何处理不同的类型?我认为switch case块不能被调用一百万次。
我的第二个问题是,当我调用GetFromFile方法一百万次时,会有大约4 of的大量内存分配。在我的原始代码A,B,..。结构的总大小接近200-300字节,当我调用GetFromFile方法20.000.000次时,我可以清楚地看到有5 of的内存分配。为什么?当方法结束时,结构a a和B b一定不能从内存中释放吗?它们不是指针,所以我不能手动删除。
它是一个包含使用DirectX渲染的点云的las文件。编辑:更新代码和说明
发布于 2013-07-16 23:22:33
首先,在...
pcmVertices[i].Position = reader->GetPoint()->GetPosition()->GetD3DXVECTOR3();...you调用GetPoint(),它返回一个新的动态分配的对象,但是您没有保留对用于delete它的指针的引用。如果你说从..。
Point3* LASReader::GetPoint(int index)...to任一...
Point3 LASReader::GetPoint(int index) // ALSO remove "new" from GetPoint's return
std::unique_ptr<Point3> LASReader::GetPoint(int index)...the内存回收将相对高效地解决自身问题。除非GetD3DXVECTOR3返回指向Point3对象内部任何内容的引用或指针...如果是这样的话,你最好把对象挂起来--先把指针从GetPoint保存到某个地方。
将pcmVertices更改为...也是更典型的C++。
std::vector<VertexPosColF> pcmVertices(reader->GetHeader().NPointRecords);...which确保VertexPosCoLF析构函数在pcmVertices超出作用域时运行,然后按照...
for (int i = 0; !reader->AllPointsRead(); ++i)
{
VertexPosColF v;
v.Position = reader->GetPoint()->GetPosition()->GetD3DXVECTOR3();
v.Color = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 1.0f);
pcmVertices.push_back(v);
}发布于 2013-07-16 23:23:02
如果你可以把你的方法作为一个对象的成员,你可以这样做(伪代码)
class PLoaderInterface
{
virtual P GetFromFile();
}基于该接口创建2个类LoaderA和LoaderB
在LoaderA和LoaderB的构造函数中,预加载P数组(结构P似乎等于A)和B数组中的所有内容
现在创建一种工厂
PLoaderIntetface GetLoader(string filename);其中取决于您的文件类型,您分配的类型或其他!
发布于 2013-07-16 22:53:57
我不知道您是否可以避免if语句,但如果这只是对bool变量的检查,那么它不会对性能产生太大影响。通过仅在需要的范围内声明a和b,可以在一定程度上提高性能。
P GetFromFile()
{
P p;
if(file_is_A_formatted) {
A a;
stream.read((char*)&a, sizeof(A));
p.x = a.x;
p.y = a.y;
}
else {
B b;
stream.read((char*)&b, sizeof(B));
p.x = b.x;
p.y = b.y + b.z;
}
return p;
}如果你有内存泄漏,那是你代码中的其他地方,因为这段代码不应该泄漏。当然,您的代码包含许多语法错误,但我猜这只是您在此处键入的错误。
https://stackoverflow.com/questions/17679772
复制相似问题