C++ - 指向函数中局部变量的指针

C++ - Pointer to local variable within the function

本文关键字:局部变量 指针 函数 C++      更新时间:2023-10-16

我知道这看起来像是一个已经问了一千次的菜鸟问题。但是我搜索了确切的答案,但我还没有找到......

我正在编写一个代码,总而言之,用不同的数据填充XML。

我正在尝试优化其中的一部分。"朴素"代码如下:

xml << "<Node>";
for(auto& input : object.m_vec)
{
if(input == "Something")
{
xml << input;
}
}
xml << "</Node>";
for(auto& input : object.m_vec)
{
if(input == "SomethingElse")
{
xml << "<OtherNode>";
xml << input;
xml << "</OtherNode>";
break;
}
}

重要的是,虽然<Node></Node>中适合多个输入,但只有一个输入适合<OtherNode></OtherNode>(解释break;(,并且也可能不存在(解释if语句之间的xml <<(。

我想我可以像这样优化它:

std::vector<std::string>* VecPointer;
xml << "<Node>";
for(auto& input : object.m_vec)
{
if(input == "Something")
{
xml << input;
}
else if(input == "SomethingElse")
{
VecPointer = &input;
}
}
xml << "</Node>";
if(!VecPointer->empty())
{
xml << "<OtherNode>"
<< *VecPointer
<< "</OtherNode>";
}

对我来说,这里的重点是不需要额外的内存,也没有额外的循环。但是指向局部变量的指针困扰着我。以初学者的眼光,我看不到可能导致错误的情况。

可以吗?为什么?你看到更好的方法了吗?

你需要确保你的compairson也在VecPointer中寻找一个现有的值,因为你原来的第二个循环只关心它遇到的第一个值。

else if(VecPointer && input == "SomethingElse")

不要寻找->empty(),因为这是访问指针并询问指向的向量是否为空。如果一开始没有什么可指出的,那么你在陈述->阶段会过得很糟糕。相反,如果反对它,因为它是一个指针。

if(VecPointer)

最后,您使用 Vector 从 m_vec 中保存该值,我假设它不是vector<vector<string>>而是vector<string>- 在后一种情况下,您的VecPointer应该std::string*

std::string* VecPointer = nullptr;

我正在尝试优化其中的一部分。
...
可以吗?

也许不是!这可能已经是对你时间的不良利用。你确定这就是损害你表现的原因吗?或者根本存在性能问题?

记住Don Knuth的一句老话:过早的优化是万恶之源......

你看到更好的方法了吗?

考虑分析程序以查看哪些部分实际占用的时间最多。


在不相关的说明中,您可以使用标准库算法来简化(未优化的(代码。例如:

if (std::ranges::find(std::begin(object.m_vec) std::end(object.m_vec), "SomethingElse"s ) 
!= std::end(object.m_vec)) 
{
xml << "<OtherNode>" << whatever << "</OtherNode>";
}