C ++ - указатель на локальную переменную внутри функции - PullRequest
2 голосов
/ 16 октября 2019

Я знаю, что это может выглядеть как вопрос новичка, уже задаваемый тысячу раз. Но я искал точный ответ и не нашел его ...

Я работаю над кодом, который, чтобы подвести итог, заполнить XML другими данными.

IЯ пытаюсь оптимизировать часть этого. «Наивный» код выглядит следующим образом:

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;), и этоможет и не существовать (объяснение xml << между if оператором).

Я думаю, что я мог бы оптимизировать его, например:

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>";
}

Смысл для меня здесьчто нет необходимости в дополнительной памяти и нет дополнительного цикла. Но указатель на локальную переменную беспокоит меня. В глазах моего новичка я не вижу случая, когда это может привести к чему-то неправильному.

Это нормально? Почему? Вы видите лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Я пытаюсь оптимизировать часть этого.
...
Это нормально?

Возможно, нет! Это может быть уже плохое использование вашего времени. Вы уверены, что это вредит вашей работе? Или что вообще есть проблема с производительностью?

Помните старую поговорку Дона Кнута: Преждевременная оптимизация - корень всего зла ...

Видите ли вылучший способ сделать это?

Рассмотрим профилирование вашей программы , чтобы увидеть, какие части на самом деле занимают больше всего времени.


На несвязанной нотеВы можете использовать стандартные библиотечные алгоритмы для упрощения вашего (неоптимизированного) кода. Например:

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>";
}
1 голос
/ 16 октября 2019

Вы должны убедиться, что ваш 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...