다음 기능을 고려하십시오.
void func(bool& flag)
{
if(!flag) flag=true;
}
flag에 유효한 부울 값 true
이 있으면 다음과 같이 무조건으로 설정하는 것과 동일합니다 .
void func(bool& flag)
{
flag=true;
}
그러나 gcc도 clang도 이런 방식으로 최적화하지 않습니다. 둘 다 -O3
최적화 수준 에서 다음을 생성합니다 .
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
내 질문은 : 코드가 최적화하기에는 너무 특수한 경우 입니까? flag
아니면 그러한 최적화가 원하지 않는 이유 가 volatile
있습니까? flag
그럴 수있는 유일한 이유는 그것을 읽는 시점에서 정의되지 않은 동작없이 어떤 식 으로든 비 true
또는 false
가치를 가질 수 있다는 것입니다. 그러나 이것이 가능한지 확실하지 않습니다.
1
가 사용됩니다. godbolt.org/g/swe0tc