Всем Привет. Уже просто выводит компилятор студии и тот гуан который он компилит, код с оптимизацией не пашет, выключаешь все работает, при просмотре в дизасме студия вобще вырезает пол кода из разных функций не говоря уже о том что полностью вырезает код где присутствуют не адресные структуры, Unk_0.tmp = 1;, просто 100% код который будет работать не работает .. собственно сам вопрос, есть ли какая нибудь альтернатива ей чтобы поддерживался синтаксис и все проекты можно было перенести без особого гемороя ...
freeq, честно говоря, именно с VC таких проблем у меня никогда не возникало. Если код написан правильно, безо всяких извратов, то код 100% рабочий хоть в дебаге, хоть в релизе. Предоставьте пожалуйста, кусок кода, который у вас коряво компилируется.
вот простой пример в аттаче, если вырубить оптимизацию все заполнится, а так это представляет из себя в дизасме такой код: Код (Text): public start start proc near xor eax, eax retn start endp возможно я многое от нее требую, но иногда по целому дню ищешь в чем же проблема, т.к. очень важен размер, а оптимизация его дает.
Код (Text): freeq, честно говоря, именно с VC таких проблем у меня никогда не возникало. Если код написан правильно, безо всяких извратов, то код 100% рабочий хоть в дебаге, хоть в релизе. Предоставьте пожалуйста, кусок кода, который у вас коряво компилируется. да согласен, студия очень удобна, но в коде есть извраты как с вызовом апи так и с другим, но в целом все написано по "стандарту" и явные хаки не используются.
freeq В таком случае необходимо отказаться от скриптов и писать на асме. Разумеется что всяко хек скрипт нормально не скомпилет.
да я тоже об этом думал, иногда так и делаю, но 100% перейти на него не готов, но у дельфы вот например таких проблем нет, компил граммотный ...
freeq а что ты хотел от этого кода?? естественно оптимизатор удаляет мертвый код жесть какая-то %) нубам не нравится что у компилятора работает оптимизатор
freeq компилятор никакого как вы выразились "гуан" не компилирует, зачем в исполняемом модуле что то, что не имеет никакого смысла, либо то, что никогда не будет выполняться. к примеру такой код Test.dwTemp_1 = 1; Test.dwTemp_2 = 2; Test.dwTemp_3 = 3; if(Test.dwTemp_1 == 1){ _tprintf(_T("%i\n"), Test.dwTemp_1); } else if (Test.dwTemp_2 == 2){ _tprintf(_T("%i\n"), Test.dwTemp_2); } будет выглядеть так 01011000 push 1 01011002 push offset string L"%i\n" (10120F4h) 01011007 call dword ptr [__imp__wprintf (10120A0h)] никаких проверок на равенство с единицей не будет так как Test.dwTemp_1 всегда будет единицей ветка else if вообще отсутствует так как в ней нет необходимости согласен с Clerk пишите на Asm
кроме полного перехода на асм, есть еще варианты управлять оптимизацией, а не оптимизировать все подряд с одним и темже ключом. например, mov ebx,[ebx] позволяет бегать по стеку вызовов. но, если вы скомпилите с -O1, то прога в этом месте рухнет, тк -O1 омитит заголовки. а вообще, заводите дружбу с дебугером. тем более, что, как на меня, студийный сорслевел дебугер - единственная причина тратить диск на студийное иде
стандартный заголовок push ebp mov ebp, esp те чему равно dword [ebp]? прально, предыдущему ebp. ну там, [ebp + 4] == адрес возврата из функции итд, сами понимаете
в некоторых прогах видел внутренний дебугер, выдающий дизасм листинги при ошибке. + к значениям регистров и флагов. довольно удобно.
GoldFinch Код (Text): STACK_FRAME struct rEbp PVOID ? ; PSTACK_FRAME rEip PVOID ? STACK_FRAME ends STACK_FRAME_EX struct Cookie ULONG ? Frame STACK_FRAME <> STACK_FRAME_EX ends
не элитьте и обоснуйте выше цитату, я не первый год уже на студии, вы попросили пример я вам дал самый простой, полные проекты выкладывать я не буду и весь код в них используется, более ясный пример: попробуйте напишите/возьмите какой нибудь эксплойт где используются не адресные структуры и соберите его в студии с дефолтными настройками проекта, устанете отлаживать и считать бсоды, а оптимизация лично мне нужна лишь для размера, ясно что после пака ехе, он будет весить почти столько же сколько он был бы при оптимизации, другой вопрос в том что она может вырезать куски и со временем натыкаешься на эти камни, т.к. после каждой сборки проводить полностью тест всего нет желания. qqwe спасибо за ответ, попробую
freeq если ты не умеешь пользоваться своим компилятором, нечего на него гнать, что он "гуан компилит" и ладно бы это про гцц, где надо кучу манов читать %) "дефолтные настройки" оптимизатора рассчитаны на нормальный код, а не на сплоеты. Уметь надо пользоваться инструментами, а не быдлокодить с "дефолтными настройками" не понимая что они означают и как работает компилятор.
freeq Вы забываете, что С++ (если не считать расширений конкретного компилятора) - это язык описания алгоритма, а не бинарного кода. Таким образом, задача компилятора - сгенерировать код, функционально эквивалентный исходнику. С чем он успешно справился - Ваша int Main() функционально эквивалентна: int MyMain() { return 0; } Подобно тому, как a + b - a эквивалентно b. Если Вам важна форма, а не только функциональность бинарного кода, то до некоторой степени могут помочь MS-расширения С++, ключи компилятора и знание особенностей его работы, а в общем случае нужно использовать ассемблер.
freeq Выбрасывание лишнего кода - это ещё "цветочки". Последние компиляторы MSVC способны на гораздо большее творчество - частичное объединение ф-ций, изменение конвенций вызова, изменение логики работы ф-ции на основании анализа всех возможных контекстов её вызова... в общем, много чего.
GoldFinch я вас не гнал, компилятором я пользоваться умею, но не так тонко как видимо делают это другие. green Спасибо за ответ! Да тоже заметил что ф-ции объединяет и несколько других не приятных вещей, я думал уже я один такой
freeq Наоборот, это очень приятные вещи. Собственно, такая сообразительность и определяет качество компилятора.