Кодируйте управление форматированием и управление исходным кодом diffs

Как другие компиляторы, такие как msvc8 или даже компилятор порядка, такие как borland c ++ 5.5.1, способны создавать очень маленькие исполняемые файлы, а mingw gcc не может?

Я сделал быструю компиляцию «Привет мир» для каждого из следующих наборов инструментов и наблюдал размер скомпилированного исполняемого файла. Обратите внимание, что во всех этих случаях библиотека времени выполнения статически связана, и все символы отладки удалены:

compiler toolchain            exe size                   exe size
                              (w/iostream header)        (w/cstdio printf)
-------------------------------------------------------------------------
Borland C++ 5.5.1             110kbyte                    52kbyte
MSVC 2008 express             102kbyte                    55kbyte
MinGW- GCC 3.4.5              277kbyte                    <10kbyte
MinGW- GCC 4.4.1              468kbyte                    <10kbyte

Что интересно, более поздняя версия gcc 4.4.1 производит даже больший исполняемый файл, чем gcc3.4.5 , вероятно, из-за другой версии libstdc ++.

Так есть ли способ удалить мертвый код на этапе компоновки для mingw?

8
задан vrwim 3 May 2015 в 17:09
поделиться

6 ответов

Может быть, вам следует выбрать один формат и запустить какой-нибудь инструмент отступов перед регистрацией, чтобы каждый человек мог проверить, переформатировать в соответствии со своими предпочтениями, внести изменения, переформатировать обратно до официального стандарта а затем проверить?

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

Изменить: это, возможно, также решит проблему скобок.

(Я сам не пробовал это решение, отсюда "возможно" и "возможно", но я были в проектах с такими же проблемами, и очень сложно пытаться пройти через различия с сотнями нерелевантных изменений, которые не ограничиваются пробелами, но включают само форматирование.)

2
ответ дан 5 December 2019 в 14:06
поделиться

Git действительно имеет следующие параметры:

  • - ignore-space-at-eol

    Игнорировать изменения в пробелах в EOL.

  • -b, --ignore-space- change

    Игнорировать изменения количества пробелов. Это игнорирует пробелы в конце строки и учитывает все другие последовательности одного или нескольких символы пробелов должны быть эквивалентными.

  • -w, --ignore-all-space

    Игнорировать пробелы при сравнении строк. Это игнорирует различия, даже если в одной строке есть пробелы, а в другой - нет.

Я не уверен, можно ли игнорировать изменения фигурных скобок с помощью Git diff.

Если это код C / C ++, вы можете определить правила Astyle , а затем преобразовать стиль фигурных скобок исходного кода в тот, который вам нужен, используя Astyle . Затем git diff выдаст нормальный результат.

5
ответ дан 5 December 2019 в 14:06
поделиться

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

public void test() {
  Map<String, String> myMap = new HashMap<String, String>();

  for (String key : myMap.keySet()) {
    System.out.println(key);
    System.out.println(myMap.get(key));
  }

  Set<String> keySet = myMap.keySet();
  for (String key : keySet) {
    System.out.println(key);
    System.out.println(myMap.get(key));
  }
}

, и когда я декомпилировал файл класса с помощью Jad , я получил:

public void test()
{
    Map myMap = new HashMap();
    String key;
    for(Iterator iterator = myMap.keySet().iterator(); iterator.hasNext(); System.out.println((String)myMap.get(key)))
    {
        key = (String)iterator.next();
        System.out.println(key);
    }

    Set keySet = myMap.keySet();
    String key;
    for(Iterator iterator1 = keySet.iterator(); iterator1.hasNext(); System.out.println((String)myMap.get(key)))
    {
        key = (String)iterator1.next();
        System.out.println(key);
    }
}

Итак, вот ваш ответ. Он вызывается один раз с любой формой цикла for.

html

5
ответ дан 5 December 2019 в 14:06
поделиться

Beyond Compare делает это (и многое другое), и вы можете интегрировать его либо в Subversion, либо в Sourcesafe как внешний инструмент сравнения.

0
ответ дан 5 December 2019 в 14:06
поделиться

Subversion, по-видимому, поддерживает это либо изначально в последних версиях, либо с помощью альтернативного diff, такого как Gnu Diff.

0
ответ дан 5 December 2019 в 14:06
поделиться

Как объяснено в Возможно ли, чтобы git-merge игнорировал различия в конце строки? , это скорее вопрос привязки правильного инструмента сравнения к вашей любимой VCS, вместо того, чтобы полагаться на правильную опцию VCS (даже если у Git есть некоторые опции относительно пробелов, подобные упомянутой в ответе Алана , она всегда будет не такой полной, как хотелось бы).

DiffMerge является более полным по этим параметрам «игнорирования», поскольку он может не только игнорировать пробелы, но и другие «варианты» на основе языка программирования, используемого в данном файле.

0
ответ дан 5 December 2019 в 14:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: