Если переменная не читается никогда, она, очевидно, оптимизирована. Однако единственная операция хранилища этой переменной является результатом единственной операции чтения другой переменной. Таким образом, эту вторую переменную также следует оптимизировать. Почему это не делается?Почему GCC 4.8.2 не распространяет оптимизацию «не используется, но задает»?
int main() {
timeval a,b,c;
// First and only logical use of a
gettimeofday(&a,NULL);
// Junk function
foo();
// First and only logical use of b
gettimeofday(&b,NULL);
// This gets optimized out as c is never read from.
c.tv_sec = a.tv_sec - b.tv_sec;
//std::cout << c;
}
Aseembly (GCC 4.8.2 с -O3):
subq $40, %rsp
xorl %esi, %esi
movq %rsp, %rdi
call gettimeofday
call foo()
leaq 16(%rsp), %rdi
xorl %esi, %esi
call gettimeofday
xorl %eax, %eax
addq $40, %rsp
ret
subq $8, %rsp
Редактировать: Результаты одинаковы для использования rand()
.
Я не уверен, что это ответ, но я подозреваю, что это происходит из-за того, что 'gettimeofday' не имеет какой-либо спецификации, говорящей, что параметр не используется внутри этой функции (например,' in'/'out' specs). В противном случае можно было бы оптимизировать не только 'a' и' b', но и вызов функции. – mvidelgauz
Если я использую простой 'a = rand(); Foo(); b = rand(); '. Это также дает тот же результат. – themagicalyang
@underscore_d Я не уверен, что понимаю вас. Я имел в виду, что «переменная не была ** изменена ** в какой-то функции», но «не была ** использована ** в функции». – mvidelgauz