2016-07-07 4 views
1

Если переменная не читается никогда, она, очевидно, оптимизирована. Однако единственная операция хранилища этой переменной является результатом единственной операции чтения другой переменной. Таким образом, эту вторую переменную также следует оптимизировать. Почему это не делается?Почему 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().

+0

Я не уверен, что это ответ, но я подозреваю, что это происходит из-за того, что 'gettimeofday' не имеет какой-либо спецификации, говорящей, что параметр не используется внутри этой функции (например,' in'/'out' specs). В противном случае можно было бы оптимизировать не только 'a' и' b', но и вызов функции. – mvidelgauz

+0

Если я использую простой 'a = rand(); Foo(); b = rand(); '. Это также дает тот же результат. – themagicalyang

+0

@underscore_d Я не уверен, что понимаю вас. Я имел в виду, что «переменная не была ** изменена ** в какой-то функции», но «не была ** использована ** в функции». – mvidelgauz

ответ

3

Там нет операции магазина! Там являются 2 звонка на gettimeofday, да, но это видимый эффект. И видимые эффекты - это то, что невозможно оптимизировать.

 Смежные вопросы

  • Нет связанных вопросов^_^