我知道斷言可以分別在運行時啓用/禁用,用於調試和生產。然而,我發現斷言也增加了生成的二進制文件的大小(在下面的例子中大約爲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代碼:
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);
}
}
}
編輯:事實上,它似乎對我來說,這個啓用/禁用是一個更有用的編譯時間e功能比運行時。我的意思是,有多少終端用戶可以啓用它們?就調試過程中的程序員而言,他/她可能會重新編譯代碼。
這並不能證明每個斷言的開銷都是200字節,只有那個。 – EJP
@EJP:當然。我的意思是說整體聲明導致的不可忽略的增長。確切數額當然取決於聲明的複雜性。 – tskuzzy
如果你打擾這些事情,你的語言是錯誤的。 – lvella