Нет.
Грустная история, но C ++ предполагает, что если вы вызываете функцию, то эта функция может вызывать всевозможные побочные эффекты, включая изменение значения binded.ID (что функция каким-то образом знает)
За исключением
Если вы убедитесь, что вызываемые вами функции не имеют абсолютно никакого законного способа узнать о вашем bindend.ID
, либопрямо (путем ссылки на него) или косвенно (потому что кто-то другой взял указатель на него и передал его).Вот простой пример (при условии, что side_effect()
находится в другой единице перевода)
int side_effect();
int k=1;
int main()
{
side_effect();
if (k!=0) return 0;
side_effect();
if (k!=0) return 0;
side_effect();
if (k!=0) return 0;
}
side_effect()
может использовать и изменять k
на законных основаниях, объявляя его внешним.Нельзя оптимизировать вызов side_effect
.
int side_effect();
static int k=1;
int main()
{
side_effect();
if (k!=0) return 0;
side_effect();
if (k!=0) return 0;
side_effect();
if (k!=0) return 0;
}
Для side_effect
невозможно получить доступ к k
разрешенным способом, потому что вы не можете получить доступ к статике в другой единице перевода.Следовательно, код можно оптимизировать до side_effect(); return 0
, потому что k не изменится, пока side_effect () не копается в памяти.Конечно, это было бы неопределенным поведением.
int side_effect();
void snitch(int*);
static int k=1;
int main()
{
snitch(&k); // !!!
side_effect();
if (k!=0) return 0;
side_effect();
if (k!=0) return 0;
side_effect();
if (k!=0) return 0;
}
Компилятор не может знать, если snitch()
сохраняет свой аргумент в месте, где side_effect()
может его изменить, поэтому нет вызова side_effect()
можно исключить.
Вы получите ту же ситуацию, если у вас есть k
в качестве локальной переменной: если есть вероятность, что какая-то неизвестная подпрограмма может получить доступ к k
легальным способом, то компилятор можетне выполнять оптимизацию на основе значения k.
PS: Создание k
const не помогает, поскольку законно отбрасывать const.Константность не может быть использована в качестве подсказки по оптимизации.