Когда мне следует использовать временные переменные?[закрыто]

StackOverflow https://stackoverflow.com/questions/2725285

  •  02-10-2019
  •  | 
  •  

Вопрос

В частности, мне интересно, что из этого мне следует написать:

{
    shared_ptr<GuiContextMenu> subMenu = items[j].subMenu.lock();
    if (subMenu)
        subMenu->setVisible(false);
}

или:

{
    if (items[j].subMenu.lock())
        items[j].subMenu.lock()->setVisible(false);
}

Я не обязан следовать каким-либо правилам стиля.Я не думаю, что после оптимизации какой-либо выбор повлияет на производительность.Какой стиль обычно предпочитается и почему?

РЕДАКТИРОВАТЬ:тип элементов[j].subMenu — boost::weak_ptr.lock() создает из него общий_ptr.На самом деле в двух вышеприведенных версиях существует неоднозначная разница в отношении продолжительности действия временного Shared_ptr, поэтому я обернул два примера в { скобки }, чтобы устранить двусмысленность.

Это было полезно?

Решение

Альтернативный метод:

if(shared_ptr<GuiContextMenu> subMenu = items[j].subMenu.lock()) {
    subMenu->setVisible(false);
}
//subMenu is no longer in scope

Я предполагаю, что subMenu это weak_ptr, в этом случае ваш второй метод создает два временных, которые могут или не могут быть проблемой. И ваш первый метод добавляет переменную к более широкому объему, чем нужно. Лично я пытаюсь избежать заданий в пределах if заявления, но это один из немногих случаев, когда я чувствую себя более полезным, чем альтернативы.

Другие советы

В это конкретное дело, ты Действительно должен Используйте версию с временной переменной. Причина не производительность, но правильность - в основном вы не гарантируетесь, что два x.lock() Вызывы возвращают одинаковое значение (например, если другой поток выпускает последнюю сильную ссылку на объект только между двумя вызовами). Удерживая сильную ссылку во временную переменную, вы убедитесь, что она не исчезнет.

Кроме этого:

  • Компиляторы обычно не могут оптимизировать вызовы функций, если только они не добывают без боковых эффектов (это трудно сделать, но атрибуты могут помочь) или включить. В этом случае вызов имеет побочные эффекты.

  • Использование временных времен может привести к более коротким, более читаемым и многократным программам (например, в случае ошибки, вы исправляете его в одном месте)

Я думаю, что вы правильно относитесь к тому, что никто не отличается от оптимизации.

Лично я бы объявил новую переменную, если это делает код более читаемым, например, когда вы будете цепочки вызовов, или вызовы функций, вызовы внутри функции. До тех пор, пока он поддерживается, и код достигает того же эффекта без разницы скорости, все сводится к читаемому коду.

Редактировать:

Mmyers купил хороший комментарий. Да, будьте осторожны о звонке lock() дважды, а не только один раз. У них будет разные эффекты в зависимости от вашей реализации.

Выбор по сути зависит от вас, но основная вещь, которую вы должны смотреть на ремонтопригодность.

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

if( fn() > 0 ) ...

все, что вы узнаете постфактум, это то, что функция вернула значение либо меньше нуля, либо ноль или больше.Даже если возвращаемое значение было неправильным, код все равно может работать.Присвоение его переменной, которую можно проверить в отладчике, позволит вам определить, ожидалось ли возвращаемое значение.

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

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

if( isValid && fn() ) ...

функция никогда не будет вызвана, если isValid имеет значение false.

Обстоятельств, при которых код может быть взломан при сопровождении неосторожного программиста (а задачи по сопровождению зачастую возлагаются на менее опытных программистов), много, и их, вероятно, лучше избегать.

В этом конкретном примере я думаю, что это зависит от того, что lock() делает. Функция дорогая? Может ли он вернуть разные вещи каждый раз, когда вызывается функция (может ли она вернуть указатель в первый раз и ноль во второй раз)? Есть ли другой поток, который может промокнуть между двумя вызовами lock()?

Для этого примера вам нужно понять поведение lock() И остальная часть вашего кода для разумного решения.

Я предпочитаю первую большую часть времени, потому что он делает код более прозрачным и простым для чтения, поэтому меньше ошибок. Например, вы забыли скобки на этом втором примере :) В этом случае, на самом деле, я, вероятно, сделаю то, что вы сделали во втором примере, однако, если мне нужно было использовать эту подменю более нескольких раз, Первый, чтобы сделать код легче читать. Что касается производительности, я бы в любом здравом компиляте сможет оптимизировать, что (что, вероятно, почему вы не видели разницы в производительности).

Кроме того, поскольку указывали ммицы, что также зависит от того, что делает замок (). В общем, если это простой метод Getter или что-то в этом роде, все будет в порядке.

Что вы предпочитаете. Для меня это зависит от того, сколько я буду использовать; Для двух строк, я мог бы просто написать это оба раза, тогда как я создаю переменную, если я использую ее больше. Тем не менее, вы тот, кто, скорее всего, должен будет поддерживать этот код и продолжать смотреть на него, поэтому используйте все возможное для вас. Конечно, если вы находитесь в компании с руководством кодирования, следуйте по нему.

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

В этом случае я думаю, что вы должны использовать временные. Даже если вы знаете, что реализация на .LOC () недорого, что может измениться. Если вам не нужно звонить заблокировать () дважды, не найдите. Значение здесь заключается в том, что он определяет ваш код из реализации блокировки (). И это хорошо в целом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top