Почему исполняемый файл такой большой? (Почему не удаляется мертвый код?)

Компиляция и связывание этого файла приводит к исполняемому файлу размером 1 КиБ :

#pragma comment(linker, "/Entry:mainCRTStartup") // No CRT code (reduce size)
#pragma comment(linker, "/Subsystem:Console")    // Needed if avoiding CRT

#define STRINGIFIER(x)    func##x
#define STRINGIFY(x)      STRINGIFIER(x)
#define G   int STRINGIFY(__COUNTER__)(void) { return __COUNTER__; }

int mainCRTStartup(void) { return 0; }  // Does nothing

#if 0
    // Every `G' generates a new, unused function
    G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G
    G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G
#endif

При изменении #if 0 до #if 1 ), выходной размер удваивается до 2 КиБ.

Похоже, что это делается со всеми версиями Visual C ++ на сегодняшний день, хотя мои параметры командной строки содержат все оптимизации, которые я мог придумать:

/Ox /MD /link /fixed /OPT:ICF /OPT:REF

и, в частности, я не включил никакой отладочной информации.

Кто-нибудь знает, почему / OPT: REF не заставляет компоновщик удалять неиспользуемые функции?

19
задан Mehrdad 23 February 2012 в 23:50
поделиться