Как другие компиляторы, такие как 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?
Может быть, вам следует выбрать один формат и запустить какой-нибудь инструмент отступов перед регистрацией, чтобы каждый человек мог проверить, переформатировать в соответствии со своими предпочтениями, внести изменения, переформатировать обратно до официального стандарта а затем проверить?
Пара дополнительных шагов, но они уже используют инструменты для отступов при работе. Может быть, это запускаемый скрипт регистрации?
Изменить: это, возможно, также решит проблему скобок.
(Я сам не пробовал это решение, отсюда "возможно" и "возможно", но я были в проектах с такими же проблемами, и очень сложно пытаться пройти через различия с сотнями нерелевантных изменений, которые не ограничиваются пробелами, но включают само форматирование.)
Git действительно имеет следующие параметры:
- ignore-space-at-eol
Игнорировать изменения в пробелах в EOL.
-b, --ignore-space- change
Игнорировать изменения количества пробелов. Это игнорирует пробелы в конце строки и учитывает все другие последовательности одного или нескольких символы пробелов должны быть эквивалентными.
-w, --ignore-all-space
Игнорировать пробелы при сравнении строк. Это игнорирует различия, даже если в одной строке есть пробелы, а в другой - нет.
Я не уверен, можно ли игнорировать изменения фигурных скобок с помощью Git diff.
Если это код C / C ++, вы можете определить правила Astyle , а затем преобразовать стиль фигурных скобок исходного кода в тот, который вам нужен, используя Astyle . Затем git diff
выдаст нормальный результат.
Если вы хотите быть абсолютно уверены, то скомпилируйте его обоими способами, декомпилируйте и сравните. Я сделал это со следующим источником:
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.
htmlBeyond Compare делает это (и многое другое), и вы можете интегрировать его либо в Subversion, либо в Sourcesafe как внешний инструмент сравнения.
Subversion, по-видимому, поддерживает это либо изначально в последних версиях, либо с помощью альтернативного diff, такого как Gnu Diff.
Как объяснено в Возможно ли, чтобы git-merge игнорировал различия в конце строки? , это скорее вопрос привязки правильного инструмента сравнения к вашей любимой VCS, вместо того, чтобы полагаться на правильную опцию VCS (даже если у Git есть некоторые опции относительно пробелов, подобные упомянутой в ответе Алана , она всегда будет не такой полной, как хотелось бы).
DiffMerge является более полным по этим параметрам «игнорирования», поскольку он может не только игнорировать пробелы, но и другие «варианты» на основе языка программирования, используемого в данном файле.