アサーションは、それぞれ実行時にデバッグとプロダクション用に有効/無効を切り替えることができます。しかし私は、アサーションが生成されたバイナリのサイズを増やすことも発見しました(下の例では約100-200バイト)。アサーションなしのコンパイル
CおよびC++では、#define NDEBUG
の前に#include <assert.h>
のようにコンパイルすることができます。
Javaコンパイラがこれを自動的に行う方法はありますか?私は後でデバッグの目的でソースコードにそれらを残したいと思います。しかし、結果のバイナリを必要以上に大きくすることは望ましくありません(設計要件としてサイズ制限があります)。
Cコード:
//#define NDEBUG
#include <assert.h>
int main(void) {
assert(0); // +200 bytes without NDEBUG, 0 with NDEBUG
return 0;
}
Javaコード:bnをすることに応答して
public class Test {
public static void main(String[] args) {
assert(System.nanoTime()==0); // increases binary size by about 200 bytes
}
}
の答え:
public class Test2 {
public static final boolean assertions = false;
public static void main(String[] args) {
if(assertions) {
assert(System.nanoTime()==0);
}
}
}
EDIT:実際には、それはそうこの機能の有効化/無効化は、より便利なコンパイル時間ですe機能を提供します。つまり、何人のエンドユーザーがそれらを有効にするのでしょうか?デバッグプロセス中にプログラマが関心を持つ限り、彼はおそらくコードを再コンパイルします。
これは、すべてのアサーションのコストが200バイトであることを証明するものではありません。 – EJP
@EJP:確かに。私が意味していたのは、全体としてアサーションによって引き起こされた無視できない増加があったということでした。正確な金額は確かに声明の複雑さに左右されます。 – tskuzzy
このようなことを気にするなら、あなたは間違った言葉を使います。 – lvella