реклама на сайте
подробности

 
 
> фича компиляторв, инкремент переменной
zhevak
сообщение May 11 2007, 11:25
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



На форуме программистов (здесь http://www.rsdn.ru/Forum/?mid=2481623) с пацанами сейчас подняли интересную тему. Думаю, что си-шникам тоже следует остерегаться подобного кода. В двух словах проблема состоит в том, как компилятор должен понимать оператор инкремента.



int i;
int x;

i = 5;
x = ++i + ++i;



Чему в результате будет равно х ?

Прикол в том, что MS VC++ 6.0 и VC++.NET дают результат, равный 14. Майкрософтовский C# и IAR говорят, что х = 13. А более всего удивил Watcom -- у него результат зависит от того, включена-ли оптимизация или нет... 07.gif

Я, конечно, понимаю, что код, который обсуждается, несколько далек от жизни, но все же, знать о таких прибабахах -- надо.

Вечером дома, попробую еще в CodeVision эту фичу покрутить.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vetal
сообщение May 12 2007, 11:11
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Потому и "undefined bihavior", что по моему мнению оператор + складывает 2 ячейки памяти с адресом I, а по вашему он заводит дополнительную переменную. Тут всё и кроется))
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 12 2007, 12:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(vetal @ May 12 2007, 15:11) *
Потому и "undefined bihavior", что по моему мнению оператор + складывает 2 ячейки памяти с адресом I, а по вашему он заводит дополнительную переменную. Тут всё и кроется))


undefined bihavior - потому что часто зависит, например, от порядка вычисления подвыражений, да и для свободы оптимизатора полезно, когда побочные эффекты можно вычислять в произвольном порядке.

Ваше мнение о том, "что оператор + складывает 2 ячейки памяти с адресом i" противоречит утверждению из стандарта, что результат вычисления ++i не есть lvalue. Так что такую интерпретацию принять не могу как "правильную" smile.gif


Цитата(zltigo @ May 12 2007, 15:48) *
Вся эта бодяга действительно отдана на откуп компилятору в зависимости от платформы. Но что интересно - в результате реального эксперимента все компиляторы для x86 платформы выдали тот самый результат, а под ARM и BF выдали warning - не смогли на штатном механизме обеспечить?
Интересный такой нюанс. Надо будет GNU на не на x86 платформе спытать.


arm-elf-gcc версии 4.1.1 выдает 13. cool.gif


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2007, 13:05
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 12 2007, 15:23) *
arm-elf-gcc версии 4.1.1 выдает 13. cool.gif

Молча?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 12 2007, 13:14
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 12 2007, 17:05) *
Молча?


По умолчанию - да.

В программе, приведенной ниже, с ключем -Wsequence-point выдается предупреждение "warning: operation on 'i' may be undefined" внутри main(), но не внутри f(). В обоих случаях - 13.

Код
int f( int* p1, int* p2 )
{
    return ++(*p1) + ++(*p2);
}

int main( void )
{
    int i;
    int x1, x2;

    i = 5;
    x1 = ++i + ++i;

    i = 5;
    x2 = f( &i, &i );

    return x2;
}


P.S. С включенной оптимизацией -O3 main своится к возврату 13.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2007, 14:14
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 12 2007, 16:14) *
В программе, приведенной ниже, с ключем -Wsequence-point выдается предупреждение "warning: operation on 'i' may be undefined" внутри main(), но не внутри f(). В обоих случаях - 13.

Ну про f() это естественно правильно - по другому было-бы крайне странно. С main() выдал warning расписавшись в непонятках - тоже каой-же после этого спрос.

Зксперименировал для начала с OpenWatcom...
Цитата
P.S. С включенной оптимизацией -O3 main своится к возврату 13.

Аналогично. C приличными оптимизациями все сводится к smile.gif
Код
    push      0000000eH
    push      offset FLAT:L$402
    call      near ptr FLAT:printf_
    add       esp,00000008H
    ret

Пришлось извне передавать.
Код
void dummy( int i )
{
int k = ++i + ++i;
    printf( "k=%i\r", k );
}

Это вариант с разнообразными оптимизаторами:
Код
    add       eax,00000002H
    add       eax,eax
    push      eax
    push      offset FLAT:L$402
    call      near ptr FLAT:printf_
    add       esp,00000008H
    ret

и вообще без оптимизации:
Код
    push      00000030H
    call      near ptr FLAT:__CHK
    push      ebx
    push      ecx
    push      edx
    push      esi
    push      edi
    push      ebp
    mov       ebp,esp
    sub       esp,0000000cH
    mov       dword ptr -0cH[ebp],eax
    inc       dword ptr -0cH[ebp]
    inc       dword ptr -0cH[ebp]
    mov       eax,dword ptr -0cH[ebp]
    add       eax,dword ptr -0cH[ebp]
    mov       dword ptr -4H[ebp],eax
    push      dword ptr -4H[ebp]
    mov       eax,offset FLAT:L$450
    push      eax
    call      near ptr FLAT:printf_
    add       esp,00000008H
    mov       esp,ebp
    pop       ebp
    pop       edi
    pop       esi
    pop       edx
    pop       ecx
    pop       ebx
    ret

Но при любых уровнях оптимизации "неизменно превосходный результат". warnin-ов нет. Причем, что действительно интересно даже в вырожденном случае с тупым возвратом значения , где уже все заранее решено - 14.



Цитата(vetal @ May 12 2007, 16:09) *
И говорит что так делать нельзя.

В обоих случаях оптимизации говорит нельзя?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 12 2007, 14:38
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 12 2007, 18:14) *
Но при любых уровнях оптимизации "неизменно превосходный результат". warnin-ов нет. Причем, что действительно интересно даже в вырожденном случае с тупым возвратом значения , где уже все заранее решено - 14.


В любом случае, это не есть доказательство "правильности" значения 14.

Цитата(zltigo @ May 12 2007, 18:14) *
Ну про f() это естественно правильно - по другому было-бы крайне странно. С main() выдал warning расписавшись в непонятках - тоже каой-же после этого спрос.


gcc на x86 неизменно возвращает 14. в том числе, из f() smile.gif


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2007, 14:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 12 2007, 17:38) *
В любом случае, это не есть доказательство "правильности" значения 14.

Ну скажем так, это некий результат полученный на нескольких компиляторах, без сопутствующего warning (типа не сомневались в результате?). Все другие компиляторы выдающие отличный результат неизменно генерили при этом warning. Как это можно истолковать?
А с учетом того, что авторы компиляторов разбираюся в этом скорее всего лучше, чем все здесь собравшиеся вместе взятые?
Цитата
gcc на x86 неизменно возвращает 14. в том числе, из f() smile.gif

Я мельком глянул на f() - естественно ошибся sad.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 12 2007, 15:14
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 12 2007, 18:51) *
Ну скажем так, это некий результат полученный на нескольких компиляторах, без сопутствующего warning (типа не сомневались в результате?). Все другие компиляторы выдающие отличный результат неизменно генерили при этом warning. Как это можно истолковать?
А с учетом того, что авторы компиляторов разбираюся в этом скорее всего лучше, чем все здесь собравшиеся вместе взятые?


Как истолковать? Как невыдачу предупреждения на undefined bihavior код. biggrin.gif

То, что "А с учетом того, что авторы компиляторов разбираюся в этом скорее всего лучше, чем все здесь собравшиеся вместе взятые" - утверждение просто смешное. Компилятор - не такая уж непостижимая для понимания программа. Очень много народу писало разнообразные компиляторы - ну разве что не такие оптимизирующие.

Вы никогда не читали учебники по устройству компиляторов? Вот, например, из недавних был издан на русском языке в 2001 году. "Компиляторы. Принципы, технологии, инструменты". Ахо, Сети, Ульман. Авторы, кстати - классики по теории компиляции. Очень рекомендую.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2007, 15:42
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 12 2007, 18:14) *
Как истолковать? Как невыдачу предупреждения на undefined bihavior код. biggrin.gif

И при этом выдачу предупреждения при компиляции компилятором из этой-же линейки для другой платформы smile.gif??? И выдачу предупреждения undefined bihavior этим-же компилятром для другого выражения? И все это с грубыми, по Вашему мнению нарушениями?
Цитата
Компилятор - не такая уж непостижимая для понимания программа.

Компилятор вполне постижимая - сам писал в свое время со своего-же тестового языка smile.gif для Z80 target. Проблема здесь в толковании правил и обеспечении соблюдения неписанных договоренностей.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 12 2007, 16:06
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 12 2007, 19:42) *
И при этом выдачу предупреждения при компиляции компилятором из этой-же линейки для другой платформы smile.gif??? И выдачу предупреждения undefined bihavior этим-же компилятром для другого выражения? И все это с грубыми, по Вашему мнению нарушениями?

Компилятор вполне постижимая - сам писал в свое время со своего-же тестового языка smile.gif для Z80 target. Проблема здесь в толковании правил и обеспечении соблюдения неписанных договоренностей.


Я считаю, что все, что касается правил компиляции - изложено в стандарте языка. Там нет ничего непостижимого. Стандарт - это закон. Поэтому доводы "это непостижимо" не приемлю, извините.

Я Вам привел цитаты из стандарта и разъяснил, как именно значение 14 противоречит понятию "правильности" результата этого выражения если даже забыть на время об ограничении по поводу undefined bihavior для выражения в целом. Вы можете привести какие-либо аргументы в поддержку своей позиции (утверждений об "однозначности разбора" и о "правильности" результата 14) кроме того, что некоторые космпиляторы не выдают предупреждение, выдавая в результате 14?

Ну и кроме того, хочу привести последний аргумент. То, что часть компиляторов выдает 13 (имеют полное право), а часть - 14, не означает ли, что компиляторы, не выдающие на такой код предупреждение, просто имеют более слабую диагностику по сравнению с теми, которые выдают такую диагностику?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2007, 16:29
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 12 2007, 19:06) *
Стандарт - это закон. Поэтому доводы "это непостижимо" не приемлю, извините.

Закон. Только закон (хоть "компиляторный" хоть "человеческий" ) все не описывает и уж точно не все описывает понятно. Отсюда и профессиональные писатели компиляторов и профессиональные адвокаты. И уж тем более закон не запрещает разбирать компиляторам более сложные случаи. Вот и получаем, те которые разбирают и не жалуются на непонятливость те выдают 14.
Цитата
Ну и кроме того, хочу привести последний аргумент.

Это хорошо-бы smile.gif а то ходим уже по мамнадцатому кругу sad.gif
Цитата
То, что часть компиляторов выдает 13 (имеют полное право), а часть - 14, не означает ли, что компиляторы, не выдающие на такой код предупреждение, просто имеют более слабую диагностику по сравнению с теми, которые выдают такую диагностику?

Может и быть, но! Повторяю неудобные вопросы на которые нет ответов:
B при этом, те которые 14 - все как один не выдают warnings, а те которые 13 все напротив - выдают. Случайность?
Компилятор одной линейки для одной платформы без warnings выдает 14 а для другой с warnings и 13.
Случайность?
Поведение с 14 позволяют себе минимум 4 весьма распространенных компилятора. Случайнось?
Не слишком-ли много неумелых толкователей закона среди писателей компиляторов?

P.S.
Пат.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 12 2007, 16:57
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 12 2007, 20:29) *
Закон. Только закон (хоть "компиляторный" хоть "человеческий" ) все не описывает и уж точно не все описывает понятно. Отсюда и профессиональные писатели компиляторов и профессиональные адвокаты.


Мне-то в этом законе все совершенно понятно. Это Вы почему-то жалуетесь, что там что-то непонятно написано. А по-моему, все совершенно четко. Логика есть логика. cool.gif

Кстати, Вы так и не показали, как аккуратно исполняя дерево грамматического разбора обсуждаемого выражения можно получить 14. biggrin.gif

Цитата(zltigo @ May 12 2007, 20:29) *
Может и быть, но! Повторяю неудобные вопросы на которые нет ответов:
B при этом, те которые 14 - все как один не выдают warnings, а те которые 13 все напротив - выдают. Случайность?
Компилятор одной линейки для одной платформы без warnings выдает 14 а для другой с warnings и 13.
Случайность?
Поведение с 14 позволяют себе минимум 4 весьма распространенных компилятора. Случайнось?
Не слишком-ли много неумелых толкователей закона среди писателей компиляторов?

P.S.
Пат.


arm-alf-gcc с опциями по умолчанию тоже никаких предупреждений не выдает, компилируя в 13. Нужно продолжать опровержения Вашего утверждения про заговор писателей компиляторов?

P.S. Это не пат, это мат. biggrin.gif


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 12 2007, 17:55
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 12 2007, 19:57) *
arm-alf-gcc с опциями по умолчанию тоже никаких предупреждений не выдает,

Меня не интересует работа компиляторов с подавленными warnings, даже если они собраны кем-то по умолчанию.
Цитата
Нужно продолжать опровержения Вашего утверждения про заговор писателей компиляторов?

Нет, по причине того, что Вы уже многократно однообразно повторяетесь. Не отвечая на встречные вопросы.
Если что-то новенькое - пишите всенепременнейше!
Цитата
P.S. Это не пат, это мат. biggrin.gif

Можете про себя считать, как угодно. Я это переживу smile.gif.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 13 2007, 08:35
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 12 2007, 21:55) *
Меня не интересует работа компиляторов с подавленными warnings, даже если они собраны кем-то по умолчанию.


А с отсутствующими - интересует smile.gif

Цитата(zltigo @ May 12 2007, 21:55) *
Нет, по причине того, что Вы уже многократно однообразно повторяетесь. Не отвечая на встречные вопросы.
Если что-то новенькое - пишите всенепременнейше!


Что-то новенькое?
По поводу "часть компиляторов выдает ворнинги, а часть нет" - отвечать не могу в принципе. Не понимаю логику вопроса. Я почему-то в ходе этого спора вспомнил нумерологию. Я ведь тоже не могу опровергнуть утверждение про несчастливость числа 13.

Других встречных вопросов не видел.

Ключевой метод для признания "правильности" вычисления выражения - вычисление выражения по грамматическому дереву в соответствии с семантическими правилами. Операция за операцией. Чтобы получить 14 нужно обязательно рассматривать результат ++i как lvalue. По крайней мере, в ANSI C-99 он не lvalue, следовательно, число 14 не может претендовать на правильность. Вы почему-то это ключевое логическое утверждение проигнорировали.

Цитата(zltigo @ May 12 2007, 21:55) *
Можете про себя считать, как угодно. Я это переживу smile.gif.


Это здорово. Не обижайтесь - мне само выражение понравилось. Ничего личного.

Цитата(zltigo @ May 13 2007, 10:48) *
Нет этим однозначно объяснить не получается. Посмотоите результаты реального OpenWatcom, три из многочисленных вариантов (от полной заоптимизированности в банальный возврат 14, до тупого кода при полностью отключенной оптимизации) приводил выше - без разницы. Последовательность действий при этом совершенно не изменялась - решене было приято уже ДО оптимизатора.


Я совершенноуже запутался в версиях компиляторов, на которые Вы ссылались.

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

Ключевое отличие x86 от ARM - именно в системе команд. в ARM нет операций АЛУ с аргументами в памяти. В системе команд x86 таких операций море, причем, они широко используются для обхода затычки с регистрами. Поэтому на x86 выгоднее рассматривать результат ++i как находящийся в самой ячейке памяти переменной i, хоть он и не lvalue, потому что ошибка может возникнуть только в выражениях с undefined bihavior.

Кстати, если определить i как volatile - в gcc для x86 результат становится 13.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2007, 06:24
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 13 2007, 11:35) *
А с отсутствующими - интересует smile.gif

Да ТОЛЬКО с отсутствующими и интересует. К тем которые предупредили - претензий и спроса нет.
Цитата
Других встречных вопросов не видел.

Пост номер 53. Это не вопросы, на которые я "требую" ответа. Это вопросы, которые я прежде всего задал себе и сам не знаю (не знал на тот момент) на них ответа. Но отсутствия ответа на них не позволяет мне прятать голову в песок и обвинять компиляторы не выдавшие warning в кривости.
Цитата
Я совершенноуже запутался в версиях компиляторов, на которые Вы ссылались.

Странно. 4 компилятора не выдающие warning? но выдающие 14 были перечислены рядышком в одной cтроке.
Цитата
Кстати, если определить i как volatile - в gcc для x86 результат становится 13.

Хороший эксперимент!
Кроме того, когда я экспериментировал с GNU, я по ленности запихнул эти строчки в готовый поюсовый проект sad.gif. Теперь повторив c сишным компилятором удалось получить warning. GCC x86 покинул ряды защитников "14":). С плюсовыи GNU странности, ну да бог с ним - уже не до этого. Нашел время спытать и Borland - он покидает арену с позором - выдает произвольные значения и никаких warning.
Microsoft-а у меня не стоит и лично не пытал. Посему на даный момент остается единственный достоверный стойкий оловянный солдатик - OpenWatcom. Всегда (в том числе и с volatile) выдающий 14.
Что уже явно может быть исключительно личным мнением разработчиков одного компилятора.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 13 2007, 06:43
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 13 2007, 10:24) *
Посему на даный момент остается единственный достоверный стойкий оловянный солдатик - OpenWatcom. Всегда (в том числе и с volatile) выдающий 14.


А вот это явный глюк компилятор. Посмотрите в ассемблере - cколько он раз считывает значение переменной i.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2007, 07:24
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 13 2007, 09:43) *
А вот это явный глюк компилятор. Посмотрите в ассемблере - cколько он раз считывает значение переменной i.

Никаких глюков. Считывается один раз. В случае оптимизации - все дальнейшее происходит в регистрах. В абсолютно неоптимизированном варианте - заводится дубль переменной и уже с ним дальнейшие операции. Промежуточные варианты благодаря развитой работой с памятью тоже возможны.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 13 2007, 08:02
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 13 2007, 11:24) *
Никаких глюков. Считывается один раз. В случае оптимизации - все дальнейшее происходит в регистрах. В абсолютно неоптимизированном варианте - заводится дубль переменной и уже с ним дальнейшие операции. Промежуточные варианты благодаря развитой работой с памятью тоже возможны.


Один раз, а не два? В случае volatile int i?
А если просто написать x = i + i?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2007, 08:11
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 13 2007, 11:02) *
Один раз, а не два? В случае volatile int i?
А если просто написать x = i + i?

Не два. Зачем два? Один раз в РЕГИСТР. Затем операции с регистром или тот-же регистр в промежуточную память и операции с промежуточной памятью. Какие проблемы?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 13 2007, 08:19
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 13 2007, 12:11) *
Не два. Зачем два? Один раз в РЕГИСТР. Затем операции с регистром или тот-же регистр в промежуточную память и операции с промежуточной памятью. Какие проблемы?


Проблемы с volatile. Чтение volatile переменной может обладать побочными эффектами, неизвестными компилятору, как и запись. Поэтому компилятор не может по своей воле оптимизировать чтение volatile переменных.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 13 2007, 09:15
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Oldring @ May 13 2007, 11:19) *
Проблемы с volatile. Чтение volatile переменной может обладать побочными эффектами, неизвестными компилятору, как и запись.

Ну с этим все очень просто. Берем Help к компилятору и читаем, что нам обещано:
Код
An object may be declared with the keyword  volatile.  Such an object may be freely modified by the program, and its value also may be modified through actions outside the program.

Про побочные эффекты, при чтениии это не забота volatile. Характеристика обьекта с модификатором volatile описана четко. Все остальное фантазии и пустые надежды на решение всех проблем одним махом.
Цитата
Поэтому компилятор не может по своей воле оптимизировать чтение volatile переменных.

Может, с осторожностью:
Код
The keyword  volatile indicates to the compiler that care must be taken when optimizing code referring to the object, so that the meaning of the program is not altered.  An object that the compiler might otherwise have been able to keep in a register for an extended period of time will be forced to reside in normal storage so that an external change to it will be reflected in the program's behavior.

Если вдруг существуют компиляторы налагающие более суровые ограниченя, не сочтите за труд назвать их. Очень полезно для общего развития.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Oldring
сообщение May 13 2007, 09:27
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(zltigo @ May 13 2007, 13:15) *
Может, с осторожностью:
...


Компилятор - GCC.

Не сочтите за труд, прочтите, в конце концов, стандарт языка, или хотя-бы нормальный учебник по языку программирования. Главное назначение volatile - работа с аппаратными регистрами. Например, получение данных из аппаратного FIFO. Изменение количества чтений из такой ячейки памяти приведет к некорректной работе программы. Поэтому атрибут volatile налагает очень жесткие ограничения на любой компилятор: каждое чтение volatile объекта является внешним эффектом программы, поэтому никакая оптимизация не имеет права изменить количество таких чтений.

Даже удивительно, что мне приходится Вам излагать настолько базовые понятия.

P.S. Убедитесь, пожалуйста, что Watcom поддерживает ANSI C, а не остановился в своем развитии на K&R C.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zhevak   фича компиляторв   May 11 2007, 11:25
- - vromanov   Тут все просто. По стандарту результат исполнения ...   May 11 2007, 11:29
|- - Oldring   Цитата(vromanov @ May 11 2007, 15:29) Тут...   May 11 2007, 15:37
|- - zltigo   Цитата(Oldring @ May 11 2007, 18:37) В вы...   May 11 2007, 17:48
|- - vromanov   Цитата(zltigo @ May 11 2007, 21:48) Где В...   May 11 2007, 18:54
|- - zltigo   Цитата(vromanov @ May 11 2007, 21:54) И к...   May 11 2007, 19:03
|- - Oldring   Цитата(zltigo @ May 11 2007, 23:03) Никак...   May 11 2007, 19:59
||- - PrSt   Цитата(Oldring @ May 11 2007, 22:59) Поче...   May 13 2007, 14:08
||- - lebiga   Пора рассматривать известную шутку Ричи и Керниган...   May 13 2007, 16:03
||- - zhevak   Цитата... разбиваем как это делает компилятор temp...   May 14 2007, 00:04
||- - Oldring   Цитата(zhevak @ May 14 2007, 04:04) Отсюд...   May 14 2007, 03:31
|- - vromanov   Цитата(zltigo @ May 11 2007, 23:03) Никак...   May 11 2007, 20:02
|- - zltigo   Цитата(vromanov @ May 11 2007, 23:02) Ком...   May 11 2007, 20:19
|- - Oldring   Цитата(zltigo @ May 12 2007, 00:19) Нет, ...   May 11 2007, 21:07
|- - zltigo   Цитата(Oldring @ May 12 2007, 00:07) Это ...   May 11 2007, 21:57
|- - Oldring   Цитата(zltigo @ May 12 2007, 01:57) Перев...   May 12 2007, 07:23
|- - zltigo   Цитата(Oldring @ May 12 2007, 10:23) Я-то...   May 12 2007, 08:31
|- - Oldring   Цитата(zltigo @ May 12 2007, 12:31) Выраж...   May 12 2007, 08:45
|- - zltigo   Цитата(Oldring @ May 12 2007, 11:45) Ну т...   May 12 2007, 09:26
|- - Oldring   Цитата(zltigo @ May 12 2007, 13:26) Я при...   May 12 2007, 09:34
|- - zltigo   Цитата(Oldring @ May 12 2007, 12:34) Не в...   May 12 2007, 09:36
|- - Oldring   Цитата(zltigo @ May 12 2007, 13:36) Жаль....   May 12 2007, 09:56
- - Ivan_Kov   Проблема стара как "С"... Скобки использ...   May 11 2007, 11:33
|- - zltigo   Цитата(Ivan_Kov @ May 11 2007, 14:33) Про...   May 11 2007, 18:04
- - amw   GCC 3.4.5 gcc -o x x.c x = 14 gcc -Os -o x x.c x =...   May 11 2007, 11:33
- - zltigo   Цитата(zhevak @ May 11 2007, 14:25) как к...   May 11 2007, 11:57
- - vromanov   не страдайте фигней. Вот вам выдержка из стандарта...   May 11 2007, 12:39
|- - zltigo   Цитата(vromanov @ May 11 2007, 15:39) не ...   May 11 2007, 12:42
- - vromanov   Как любителю стандартов, вам надо было не искать о...   May 11 2007, 12:51
|- - zltigo   Цитата(vromanov @ May 11 2007, 15:51) Тут...   May 11 2007, 13:13
|- - dxp   Цитата(vromanov @ May 11 2007, 19:51) Как...   May 11 2007, 13:37
|- - Сергей Борщ   Цитата(dxp @ May 11 2007, 16:37) Очевидно...   May 11 2007, 14:22
|- - zltigo   Цитата(Сергей Борщ @ May 11 2007, 17:22) ...   May 11 2007, 14:29
- - Ivan_Kov   Я вот смотрю, и не могу никак понять, что за нужда...   May 11 2007, 15:32
- - vromanov   Удивительно, что столь очевидная вещь собрала сто...   May 11 2007, 16:08
|- - lebiga   Цитата(vromanov @ May 11 2007, 20:08) Уди...   May 11 2007, 19:57
- - defunct   Цитатаx = ++i + ++i; Это в китайских исходниках...   May 11 2007, 17:54
- - vetal   По моему все очень просто, т.к. код архитектурно з...   May 12 2007, 10:16
|- - Oldring   Цитата(vetal @ May 12 2007, 14:16) 3. x=i...   May 12 2007, 10:21
- - vetal   ЦитатаТак вот откуда взялась эта третья операция -...   May 12 2007, 10:42
|- - Oldring   Цитата(vetal @ May 12 2007, 14:42) В дере...   May 12 2007, 10:52
|- - zltigo   Цитата(vetal @ May 12 2007, 13:42) Это вп...   May 12 2007, 11:48
|- - zltigo   Цитата(Oldring @ May 13 2007, 12:27) Не с...   May 13 2007, 09:38
|- - Oldring   Цитата(zltigo @ May 13 2007, 13:38) Может...   May 13 2007, 09:55
|- - zltigo   Цитата(Oldring @ May 13 2007, 12:55) В ст...   May 13 2007, 10:12
|- - Oldring   Цитата(zltigo @ May 13 2007, 14:12) Отлич...   May 13 2007, 10:26
|- - zltigo   Цитата(Oldring @ May 13 2007, 13:26) Пров...   May 13 2007, 10:37
|- - Oldring   Цитата(zltigo @ May 13 2007, 14:37) Aвтор...   May 13 2007, 11:03
|- - vromanov   Цитата(zltigo @ May 13 2007, 14:37) Ну ка...   May 13 2007, 12:03
|- - zltigo   Цитата(vromanov @ May 13 2007, 15:03) Воо...   May 13 2007, 13:15
- - Niko1a$   Посмотрите полученный ассемблерный код на своей ма...   May 12 2007, 12:42
|- - Oldring   Цитата(Niko1a$ @ May 12 2007, 16:42)...   May 12 2007, 12:46
- - vetal   nios2-elf-gcc выдает без оптимизации 13, с оптимиз...   May 12 2007, 13:09
- - vetal   ЦитатаВ обоих случаях оптимизации говорит нельзя? ...   May 12 2007, 14:57
- - singlskv   Я Вам не помешаю ? Выскажу свое ИМХО: - Компилято...   May 12 2007, 22:53
|- - zltigo   Цитата(singlskv @ May 13 2007, 01:53) - р...   May 13 2007, 06:48
|- - cebotor   Цитата(singlskv @ May 13 2007, 02:53) Я В...   May 15 2007, 06:19
|- - Oldring   Цитата(cebotor @ May 15 2007, 10:19) все ...   May 15 2007, 06:26
- - scifi   Ну вы даёте... Эту бы энергию - да в мирных целях ...   May 13 2007, 06:20
- - vromanov   А то, что значение переменной может поменяться в ...   May 14 2007, 00:07
|- - zhevak   Цитата(vromanov @ May 14 2007, 06:07) А т...   May 14 2007, 00:19
|- - vromanov   Цитата(zhevak @ May 14 2007, 04:19) не-е,...   May 14 2007, 00:22
- - amw   В пост #4 при компилляции добавляем -Wall и получа...   May 14 2007, 07:34


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 20:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01755 секунд с 7
ELECTRONIX ©2004-2016