Разве нулевая проверка перед удалением / освобождением не оптимизирует вызов функции? - PullRequest
0 голосов
/ 13 июня 2011

Есть несколько вопросов относительно , если поставить нулевую проверку перед удалением или нет.Я до сих пор видел подобные практики во многих производственных кодах, и я не верю, что все эти программисты не знали о том, что delete 0; безопасно.

Итак, мне интересно, не стоит лиПредполагая, что нулевая проверка перед delete/free обеспечит оптимизацию производительности путем сохранения вызова функции?

if(0 != p)
  delete p;

Ответы [ 3 ]

6 голосов
/ 13 июня 2011

Нет.delete не является функцией, хотя в зависимости от типа может быть вызван вызов operator delete.

В лучшем случае вы сохраняете второе сравнение до 0.Это все преждевременная оптимизация: ничто из этого не будет вашим узким местом, и вы пишете избыточный код.

Просто напишите:

delete ptr;
0 голосов
/ 13 июня 2011

Теперь я все еще видел подобные практики во многих производственных кодах, и я не верю, что все эти программисты не знали о том факте, что delete 0; безопасно.

Давным-давно не было никакой гарантии, что deletefree) безвредно ничего не сделают с нулевым указателем. Вместо этого они взорвали некоторые компиляторы / некоторые машины. Отсюда и происхождение практики.

То, что поддерживает эту практику, - это сочетание программирования культа груза и менталитета малых умов («Глупая последовательность - это хобгоблин маленьких умов».) Программисты культа грузов используют вырезание и вставку, поэтому, когда они видят Используемый синтаксис они копируют. В этом случае, поскольку некоторый код выполняет эту проверку нулевого указателя, программист-культ груза подумает, что это способ сделать это.

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

0 голосов
/ 13 июня 2011

Я не верю, что все эти программисты не знали о том, что удаляют 0;Это безопасно.

Ну, они были.Вот и все.Это факт, что delete или free на null абсолютно безопасны.Если бы они не знали об этом, то не потратили бы впустую время на проверку.

Итак, мне интересно, не стоит ли предполагать, что нулевая проверка перед удалением / освобождением дастоптимизация производительности путем сохранения вызова функции?

Вы делаете предположение ... ... потому что, вы не хотите верить, что эти парни не правы?Извини, приятель, они ошиблись, вот и все.У вас нет никаких доказательств или разумных причин полагать, что выполнение проверки null имеет такую ​​выгоду.

Или тот, кто написал этот код, думал так.В конце концов, даже если вы могли бы исключить вызов функции таким способом, стоимость вызова функции здесь минимальна, если она не встроена, что вполне может быть, и это стоит больше времени программиста нанапишите чек, который уже написан для вас.Я бы предпочел чрезмерно усердствовать в правильности, чем преждевременно оптимизировать, как это, - вы действительно делаете кому-нибудь одолжение, предполагая, что это может быть оптимизацией?

...