c++ - 性能提升 C++

标签 c++ performance algorithm memory

下面是我的代码。

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 block 不能被调用一百万次。

我的第二个问题是,当我调用 GetFromFile 方法一百万次时,分配了很多大约 4gbs 的内存。在我的原始代码 A、B、... 中,结构的总大小接近 200-300 字节,当我调用 GetFromFile 方法 20.000.000 次时,我可以清楚地看到有 5GB 的内存分配。为什么?当方法完成时,结构 A a 和 B b 是否一定不能从内存中释放?它们不是指针,所以我无法手动删除。

这是一个包含使用 DirectX 渲染的点云的 las 文件。 编辑:更新代码和解释

最佳答案

首先,在...

pcmVertices[i].Position = reader->GetPoint()->GetPosition()->GetD3DXVECTOR3();

...你调用GetPoint()它返回一个新动态分配的对象,但您没有引用指向 delete 的指针它。如果你说改变从...

Point3* LASReader::GetPoint(int index)

...对任何一个...

Point3 LASReader::GetPoint(int index)  // ALSO remove "new" from GetPoint's return

std::unique_ptr<Point3> LASReader::GetPoint(int index)

...内存释放将相对有效地自行处理。除非GetD3DXVECTOR3正在返回指向 Point3 中任何内容的引用或指针对象...如果是这样的话,那么你最好让对象保持在周围 - 保存来自 GetPoint 的指针先到某处。

更改pcmVertices也是更典型的C++到...

std::vector<VertexPosColF> pcmVertices(reader->GetHeader().NPointRecords);

...这确保了 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);
}

关于c++ - 性能提升 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17679772/

相关文章:

JAVA - 指针追逐 - 最佳实践

sql - Oracle SQL WITH 子句正确的用例和性能

arrays - 找到不在列表中的最小整数

c++ - 使用基对象修改/访问派生类信息的问题设计

c++ - 读取 UTF-8 文件并解析字符

c++ - 使用 std::async 引用对象

javascript - 如何使移动设备中的 jquery setinterval 移动更顺畅?

c - 如果输入高于阈值,则定期调用函数的算法。需要帮助

c# - c#中字符串比较的更快算法

c++ - 未定义对析构函数的引用