> Хотелось бы перевести обсуждение в другое "русло", не как > выключить оптимизацию, а как указать оптимизатору > что чтение из памяти имеет сторонний эффект.
к сожалению после установки очередного патча на MSVC6 оптимизация у меня вообще похоже вырубилась, так что проверить не могу, но можешь попробовать это
Есть такой зверь MS Visual Studio .NET beta2, а в нем VC++ 7.0...
Компилятор там точно нормальный, потому что немного старше своего "брата" из WinXP DDK.
Суть борьбы вот в чем:
Нужно заставить компилятор не "свертывать" чтение по указателю, результат которого не используется. Например имеем код:
---
При полной оптимизации (/Oxa) компилятор убивает обращения к *MyPtr, а их нужно оставить. Потому что MyPtr указывает на Memory Mapped I/O Space и чтение *MyPtr аналогично __asm in al, dx
До включения полной потимизации было достаточно volatile-спецификатора, что сейчас делать не знаю. Конечно можно тупо написать функцию чтения, но в данном случае нужно максимально быстро, и затраты на вызов функции существенны.
Было-бы интересно узнать, как указать компилятору что функция (или выражение) имеет некий side-effect и не допускает удаления, как например _inp(). Например GCC имеет для этого все средства...
[C++] Ну все, спасайте меня :-) MS VC++ 7.005.02.02 22:02 Автор: + <Mikhail> Статус: Elderman
1) RTFM - #pragma допустима только вне функции, вне декларации, вне шаблона;
2) RTFM - При глобальной "Whole Program Optimization" компилятор все равно убьет все функции без сторонних эффектов, результат которых не используеться;
3) RTFM - чтобы гарантированно выключить оптимизацию в шаблоне, ее нужно выключить везде где этот шаблон используется;
Оптимизацию выключать вообще не выгодно и не удобно. Лучше сделать несколько внешних (недоступных) оптимзатору функций, которые будут выполнять чтение или "делать вид" использования результата. Пока я так и сделал: volatile-чтения, результат которых не используется, сейчас передается параметром в недоступную оптимизатору dummy-функцию .
Это решение не нравится прежде всего тем, что вызов внешней функции(равно как и __asm-вставка) заставляет компилятор перезагружать значение регистров их памяти, и в итоге увеличивае размер кода в ~5 раз.
Хотелось бы перевести обсуждение в другое "русло", не как выключить оптимизацию, а как указать оптимизатору что чтение из памяти имеет сторонний эффект.
[C++] Извините, но это все фигня06.02.02 17:48 Автор: cb <cb> Статус: Member
> Хотелось бы перевести обсуждение в другое "русло", не как > выключить оптимизацию, а как указать оптимизатору > что чтение из памяти имеет сторонний эффект.
к сожалению после установки очередного патча на MSVC6 оптимизация у меня вообще похоже вырубилась, так что проверить не могу, но можешь попробовать это
> Выключение оптимизации конечно даст нужный эффект. Но я > использую шаблоны, поэтому если идти этим путем, то > выключать потимизаци. нужно вообще...
почему?
cb.
[C++] Скрытые директивы/ключевые слова VC++ 7.005.02.02 17:08 Автор: leo <Леонид Юрьев> Статус: Elderman
> > Выключение оптимизации конечно даст нужный эффект. Но > я > > использую шаблоны, поэтому если идти этим путем, то > > выключать потимизаци. нужно вообще... > > почему? > > cb.
Переключать оптимизацию внутри шаблона бесполезно. При генерации кода компилятор будет инсталлировать шаблоны с опциями оптимизации актуальными в месте инсталлирования. Вот и получается, что для получения нужного эффекта требуется выключить оптимизацию во всех фалах проекта, которые используют критический шаблон, и делее шаблоны которые используют это шаблон и т.д.
Это неприемлемо, гораздо проще и выгоднее вызвать внешнюю функции для "покрывания" так сказать "неприкрытого" чтения из Memory Mapped I/O Space.
Я надеюсь что кто-нибудь знает как включить доступ к скрытым директивам VC++ 7.0, и как их использовать, например _annonate, __feacpBreak __compileBreak, __pragma(plmn), __pragma(plmf), __pragma(native_caller) и т.д. Их видно в с1.dll