Это полностью зависит от того, что делает PrivateVar()
, где он определен и т. Д. Если у компилятора есть доступ к коду в PrivateVar()
и он может гарантировать отсутствие побочных эффектов, вызывая функцию, которую он может выполнять CSE, которая являетсяв основном то, что вы сделали во втором примере кода.
Точно так же верно и для цикла for.Поэтому, если вы хотите быть уверенным, что она оценивается только один раз, потому что это очень дорогая функция (что также означает, что гарантировать отсутствие побочных эффектов сложно, даже если их нет), напишите ее явно.
Если PrivateVar()
просто получатель, напишите более понятный код - даже если компилятор может не делать CSE, разница в производительности не будет иметь значения в 99,9999% всех случаев.
Редактировать: CSE означает Устранение общего выражения Sube и делает именно то, что обозначает;) На вики-странице показан пример простого умножения, но мы можем сделать это и для больших конструкций кода, например, для вызова функции.
Во всех случаях мы должны гарантировать, что только однократная оценка кода не изменит семантику, то есть выполнение CSE для этого кода:
a = b++ * c + g;
d = b++ * c * d;
и изменение его на:
tmp = b++ * c;
a = tmp + g;
d = tmp * d;
, очевидно, будет недопустимым (для вызовов функций это, очевидно, немного сложнее, но это тот же принцип).