コンパイラはかなり賢いです。しかし、コンパイラが「未使用」の関数呼び出しを削除することに頼るのは、おそらく良い考えではありません。1 つには、コンパイラは、呼び出している関数を理解する必要があります (したがって、ほとんどのコンパイラは strlen が何を行い、それが他のものにどのように影響するかを理解しているため、ここでは strlen が良い例です) - 関数がコンパイラが「理解できるものではない場合」 "、それを最適化することはできません。
あなたがした場合:
x = printf("Hello, World!\n");
x = printf("World, Hello!\n");
コンパイラが最初の printf を削除して正しいことをしたと思いますか? おそらくそうではありません...したがって、コンパイラーが「副作用がない」と判断できない関数では、結果が使用されていなくても、コンパイラーは関数を呼び出す必要があります。副作用がないということは、通常の状況での手段です-たとえば、無効なポインターで strlen() を呼び出すことの副作用があります-コードはおそらくクラッシュします-しかし、それは「通常の状況」ではありません- strlen( を使用するのはかなり馬鹿げています)ポインタが有効かどうかを確認するだけですよね?
したがって、言い換えると、strlen を呼び出す前に、strlen() への呼び出しが本当に必要であることを確認するか、コンパイラが不要な strlen 呼び出しを生成する可能性があるという事実を受け入れる必要があります。