をアサート含まは、ここでは、コードは:アサーション失敗をトリガするC++:アセンブリコードが結果
.LC0:
.string "/tmp/compiler-explorer-compiler11778-61-1sgmkbd.5d1m6g8pvi/example.cpp"
.LC1:
.string "true==false"
main:
push rbp
mov rbp, rsp
mov ecx, OFFSET FLAT:main::__PRETTY_FUNCTION__
mov edx, 5
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:.LC1
call __assert_fail
main::__PRETTY_FUNCTION__:
.string "int main()"
ラインA
、に反映されている:
#include <cassert>
int main() {
assert(true==false); // A
assert(true==true); // B
}
ここでアセンブリコード(link)はですアセンブリコードですが、B
はありません。
私の質問は:マクロassert()
は実行時アサーションのためのものであり、コンパイラはどのように結果を知ってアセンブリに書き込むことができますか?
コンパイラ:gcc 7.1、最適化-O0
(つまり最適化なし)。私はそれが最適化のためだと思ったので、私は意図的にこれをオフに切り替えました(私は?)。
編集:今主張は、()コンパイル時に評価することができ、(static_assertと重複しているようだ)。..
"実行時アサーションのためのもので、コンパイラはどのように結果を知り、それをアセンブリに書き込むことができますか?"あなたが書いたアサーションはコンパイル時定数であり、実行時に変更できない可能性があります。 –
また、アサーションは魔法のように消えるように意図されています。 – user1095108
"A"が常にヒットすることをコンパイラが証明するのはかなり簡単なので、 "B"のコードを書くことには何の意味もありません。 –