mstdn.maud.io is one of the many independent Mastodon servers you can use to participate in the fediverse.
The place to express your ❤️ more freely. / あなたの「すき」をもっと自由に書き表すための場所。

Administered by:

Server stats:

346
active users

無駄なmallocを省く例はまあトリビアみたいなものですが、ある種の(間違った)コードが最適化の順番によって動いたり動かなかったりNULLチェックが削除されたりする例が blog.llvm.org/2011/05/what-every-c-programmer-should-know_14.html にあります

blog.llvm.orgWhat Every C Programmer Should Know About Undefined Behavior #2/3In Part 1 of our series, we discussed what undefined behavior is, and how it allows C and C++ compilers to produce higher performance appli...

で、今試してみたら、GCC trunkだと-O3でNULLチェックが消去されました godbolt.org/g/AwK29X
(画像の中央にはNULLチェックに相当する灰色の背景の部分があるのに対して、右側にはないことに注目)

Clangだと消えなかった(だからClangの方が良いという話ではなく、こういうCコードを書かないようにするにはどうしたらいいかという話です)

GCC trunk、-O2で既にNULLチェック消してるな(つまりその辺のディストリビューションで配られる標準的なバイナリをコンパイルするときにこの手のコードが壊れる可能性があるということ)

で、この差はコンパイラがどんな順番でどのようにコードを最適化するかに依存しているので、コンパイラのバージョンによって結果が変わったり、どのアーキテクチャ向けにコンパイルするかによって結果が変わったり、最適化オプションをちょっと変えると結果が変わったりする