Подтвердить что ты не робот

Компиляция без утверждений

Я знаю, что утверждения могут быть включены/отключены во время выполнения для отладки и производства, соответственно. Однако я обнаружил, что утверждения также увеличивают размер сгенерированного двоичного файла (около 100-200 байт в примере ниже).

В 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
    }
}

В ответ на bn. Ответ:

public class Test2 {
    public static final boolean assertions = false;

    public static void main(String[] args) {
        if(assertions) {
            assert(System.nanoTime()==0);
        }
    }
}

EDIT: На самом деле мне кажется, что это включение/отключение является более полезной функцией времени компиляции, чем время выполнения. Я имею в виду, сколько из них будет включать конечных пользователей? Что касается программиста во время процесса отладки, он, вероятно, будет перекомпилировать код в любом случае.

4b9b3361

Ответ 1

Лично я не буду делать следующее из-за сложности, добавленной к исходному коду, но javac сгенерировал тот же самый промежуточный код для main в следующих двух фрагментах:

условные утверждения

class C {
    public final static boolean assertions = false;

    public static void main(String[] args) {
        if(assertions) {
            assert(System.nanoTime()==0);
        }
    }
}

нет утверждений

class C {
    public static void main(String[] args) {
    }
}

скомпилированный код

  public static void main(java.lang.String[]);
    Code:
       0: return        
    LineNumberTable:
      line 3: 0

ИЗМЕНИТЬ

Фактически, мне кажется, что это включение/отключение более полезно время компиляции, чем время выполнения. Я имею в виду, сколько конечных пользователей разрешить их?

Его не конечные пользователи, которые их поддерживают, это поддержка клиентов, которая сообщает конечному пользователю включить их. Я бы хотел, хотя они были включены, а не отключены по умолчанию.