double evaluation
|
double evaluation
интересно, я смотрел как работает gcc, не знал, что есть стандартом допускаеться неопределённость.. тогда такую конструкцию нельзя использовать в принципе, буду знатьСообщение от Ull9
Не контракта ради, если есть ещё пару таких задачек, напиши![]()
пожалуйста,
чем operator new отличается от new operator и отличается ли вообще?
есть класс
class MyStrinh
{
privat:
char* p;
int len;
public:
MyString():len(0),p(NULL){}
};
деструктор и другие методы для простоты опускаются.
Напиши copy construktor и assign operator
Ull9, Вы утверждаете, что компилятор волен в целях оптимизации выбирать порядок вычислений. Но неужели разработчики стандартов и компиляторов не подумали об этом? Если эти "особенности" стандарта и реализаций всплывают на таких элементарных конструкциях, то представляю, что может быть в более-менее навороченном коде. Теперь я понимаю, почему разработчики игрушек распространяют Debug версии своих творений - там компилятор хоть как-то управляем. А нам парят мозги, что для реализации эффектов нужны более мощьные процы, память. Relese версия просто не собирается или собирается, но не работает.
Настолько мне известно, компилятор может переставить эти функции, только если уверен, что это не на что не повлияет. Не знаю, написано ли это в стандарте, но мои чтения RSDN.RU и Криса Касперски (не путать с Евгением Касперским) показали, что компилятор не хочет нарываться на неприятности и поступает естественным образом, тоесть так как ожидается (но наши ожидания не всегда совпадают с разработчиковскимиэто означает, что при одних обстоятельствах (контексте) при выражении
int i = foo() + boo();
сначала выполнится foo() потом boo();).
Вопрос в лоб
Сами хоть раз встречались с таким поведением компилятора или нет - тоесть, что бы в одном файле он применил два разных способа. Ответы типа "одна бабка сказала" или "известный спец шепнул на ушко" не принимаются. Только исходный код для примера и скомпиленый результат. Не бойся, с дизассемблеров я умею управляться. Скомпиленый результат надо на той случай, если мой компилятор "не правильно скомпилит". pdb файл также не помешает. Пока не увижу - не поверю.
А пока все Ваши рассуждения о правильности/неправильности похожи на исследования сферического коня в вакууме.
Вадим, можно на ты.
<<Ull9, Вы утверждаете, что компилятор волен в целях оптимизации выбирать порядок вычислений. Но неужели разработчики стандартов и компиляторов не подумали об этом?>>
именно потому что об этом подумали, принято решение не накладывать ограничения на компилятор.
<<Теперь я понимаю, почему разработчики игрушек распространяют Debug версии своих творений - там компилятор хоть как-то управляем. А нам парят мозги, что для реализации эффектов нужны более мощьные процы, память. Relese версия просто не собирается или собирается, но не работает.>>
с++, не простой язык, это для больших мальчиков, этим ножечком можно и порезатся, но никто не заставляет, ты можешь поигратся в песочнице пластмассовым совочком (ява).
<<Настолько мне известно, компилятор может переставить эти функции, только если уверен, что это не на что не повлияет. Не знаю, написано ли это в стандарте,>>
ну раз ты не знаешь о чем разговор? компилятор может выполнять любой порядок, не обращая внимание на сайд -эффекты.
<<показали, что компилятор не хочет нарываться на неприятности и поступает естественным образом>> единственная неприятность для компилятора нарушить стандарт. остальное проблемы программиста.
<<Сами хоть раз встречались с таким поведением компилятора или нет - тоесть, что бы в одном файле он применил два разных способа. Ответы типа "одна бабка сказала" или "известный спец шепнул на ушко" не принимаются. Только исходный код для примера и скомпиленый результат. Не бойся, с дизассемблеров я умею управляться. Скомпиленый результат надо на той случай, если мой компилятор "не правильно скомпилит". pdb файл также не помешает. Пока не увижу - не поверю.
>>
Сам не сталкивался, Тк у меня были хорошие учителя. И что значит верю не верю. мне не надо верить, читай стандарт. Например я знаю что австралия есть, но мне и в голову не придет, поехать проверить. есть книги, я им верю.
Если ты будешь ишодить из принципа ПОKА НЕ УВИЖУ НЕ ПОВЕРЮ, то.... ты выбрал не ту профессию.
<<А пока все Ваши рассуждения о правильности/неправильности похожи на исследования сферического коня в вакууме.>>
не смеши. и больше нигде не говори, что веришь только уведенному а не написанному.
Ты не со мной споришь а со стандартом
вот нашел ISO Standard C++
Kнига 5, стих 4
Except where noted, the order of evaluation of operands of
individual operators and subexpressions of individual expressions, and
the order in which side effects take place, is unspecified.
И все. Точка. Kак выполнять решает компилятор.
Пример в тему. Kонституция Украины, тоже не определяет с какой ноги тебе утром вставать Ну и что Kонституцию в топку?
Теоретически, ++i быстрее. так как i изменяеться по ссылке, хотя с оптимизацией компиляторов, если i типа int, разницы в производительности цикла i++ и ++i не заметилСообщение от Ull9
тут ты сильно не прав. если твой компилятор успешно компилирует некорректные программы, это не значит что надо их писать. ты проверил все варианты параметров оптимизации ? проверил на других архитектурах ? проверил другие компиляторы ? а еще не вышедшие тоже проверил ?Сообщение от KoVadim
между прочим, правильные компиляторы на такое ругаются
правильно, но если i это POD, если это скажем итератор то разница есть, и оптимизатор ее не соптимизирует.Сообщение от Konstantin.od
поэтому лучше писать ++i
pal. Надо выбросить компилятор, который компилирует заведомо неверный код. Разработчиков выгнать. Ведь вы не будете доверять человеку, который один раз делает так, а на следующий - по другому.
Основная идея программирования - что мы можем точно объяснить компьютеру, что же мы хочем на понятном ему языку. Зачем стандарт, который допускает такие глупости. Я не верю, что такое пропустили. Там же не глупцы сидят.Вот завтра на работе попробую скомпилить под Linux Mandriva 2007 и FreeBSD 6.1, компилятор скорее всего gcc. версию уточню уже по месту.проверил другие компиляторы ?
По поводу других платформ - у меня нет такой возможности. Но есть идеи. Проверю - расскажу.У меня нет машины времениа еще не вышедшие тоже проверил ?
Опять сферические кони в вакууме. Пример в студию плиз+ссылку, откуда выкачать и проверить. Только не предлагайте такое, что нереально в Одессе сделать - типа мейнфрейме таком-то компилиться.между прочим, правильные компиляторы на такое ругаются
Если Вы также уверены в том, что сказал Ull9, пожалуйста приготовьте пример, в котором кодты проверил все варианты параметров оптимизации ?
Давал результат не 3, а 2. Для подтверждения принимаются исходники плюс скомпиленый вариант и сопутствующие файлы для отладки (ну что бы я мог убедиться что это всё не подстроено, а действительно правда). Это касается всех, кто убеждён в том, что стандарт так просто допускает двузначности.Код:int i=1; int j=2; int k=i+++j;
Ull9
Типичная ошибка больших мальчиков. На java не пишу. Маленьким мальчиком себя не считаю, хотя до "больших" наверное далеко. Поэтому считаю это личным оскорблением. Вы не удосужились даже спросить на каком языке я пишу. Плюс ко всему, я обращаюсь на Вы, а в ответ имею ты.с++, не простой язык, это для больших мальчиков, этим ножечком можно и порезатся, но никто не заставляет, ты можешь поигратся в песочнице пластмассовым совочком (ява).
Какую я же должен был выбрать? Меня воспитали человеком, который должен проверить. А насчет Австрилии. Можно на худой конец GoogleMap посмотреть. К тому же тут есть другие доказательства - фотографии к примеру, а Вы мне даже фотографий (тобыш скомпилированого кода) не предоставили.Если ты будешь ишодить из принципа ПОKА НЕ УВИЖУ НЕ ПОВЕРЮ, то.... ты выбрал не ту профессию.
По поводу Конституции. Мне кажеться пример не слишком удачный - там сказано, что личные свободы не ограничиваются. Поэтому я волен с утра выбирать. И от того, с какой ноги я утром встану и результат моего рабочего дня слабо коррелированны. Но во времена Сталина могли и приписать такое. Он мог.
Так мне кто то пример кода с сопутствующими файлами приведет?
В этом коде нет никакой двузначности, просмотрите внимательно тот пример, для которого результат был неопределён.Если Вы также уверены в том, что сказал Ull9, пожалуйста приготовьте пример, в котором код
Код:
int i=1;
int j=2;
int k=i+++j;
Давал результат не 3, а 2. Для подтверждения принимаются исходники плюс скомпиленый вариант и сопутствующие файлы для отладки (ну что бы я мог убедиться что это всё не подстроено, а действительно правда).
не думаю, что в таком вопросе можно быть 'убеждённым', стандарт либо допускает что либо нет, все закономерности вычисления - дело частного случая, на который нельзя полагаться. Сам удивился этому пару страниц назад. Впрочем, не стыдно, только учусь.Это касается всех, кто убеждён в том, что стандарт так просто допускает двузначности
Я проверил, есть такое, ссылка на стандарт - http://anatolix.naumen.ru/files/book...andard2003.zip, страница 65 по бумажной нумерации. Думаю, этого достаточно, чтобы положить конец этому спору.
ты так ничего и не понял
компилятор пытается оптимизировать код, чтобы он работал быстрее
если он не сможет переставлять местами участки, он не сможет оптимизировать. понятно, что если переставлять все, что вздумается, то оно и работать будет потом, как ему вздумается. поэтому стандарт определяет, в каких случаях компилятор свободен в выборе, а в каких нет. если бы ты внимательно изучил язык, ты бы знал, что есть sequence points, ограниченные, в частности && || , ?:
а вот + ничего не ограничивает
спор ведешь совершенно никчемный - я уже сказал, что даже если сейчас нет компилятора который скомпилирует какой-то конкретный пример с undefined behavior по другому, это не делает этот пример корректным, потому что завтра такой компилятор может появиться. и он будет соответствовать стандарту, а этот пример - нет. даже если ты будешь очень громко оспаривать существование оптимизирующих компиляторов или стандарта языка
ну, а в качестве примера
[pal@underdark tmp]$ cat a.cpp
#include <iostream>
int main ( ) {
int a = 1;
std :: cout << a + ++ a << std :: endl;
}
[pal@underdark tmp]$ g++ -o a -Wall -Werror a.cpp
cc1plus: warnings being treated as errors
a.cpp: In function ‘int main()’:
a.cpp:5: warning: operation on ‘a’ may be undefined
pal
Ваш пример неудачен. Так как играя пробелом, можно получить и не такое в этом примере.
при таком варианте "a+ + +a" имеем результат 2
при таком варианте "a++ +a" имеем результат 3
при таком варианте "a+ ++a" имеем результат 4
при таком варианте "a+ + +a" имеем результат 2
при таком варианте "a+++a" имеем законную результат 3
В данном случае пробел недопустим, так как Вас в школе должны были учить, что пробел допустим только между операторами, а вот сами операторы разрывать нельзя, что Вы и сделали.
ну и еще одна реплика с моей стороны.
в этом топике, мой пост #68Сообщение от KoVadim
<<Вадим, можно на ты.>>
я полагал, что предложив ты, я расчитывал на обоюдность.ну если тебе хочется Вы, то пожалуйста.
И я полагаю, что Вы на с++ непишите. в противном случае, если вы всетаки на нем пишите, то тем хуже для вас, и еще хуже для тех на кого вы работаете.
можете спорить дальше, но не со мной, а со Стандартом.
Ull9
Не видел.Вадим, можно на ты
На С++ не пишу, но нелюблю, когда люди доказывают свою правоту, ссылаясь только на стандарт. Человек должен мыслить, иначе он просто никто.
именно потому что я мыслю, получилось так.
прочел стандарт, несогласился, подумал, изменил свое мнение и согласился.
я действительно считаю, что стандарт очень продуман, и конкретно это сделано умно.
а чтоб доказать свою правоту, надо именно, ссылатся на стандарт. мы спорим о СТАНДАРТИЗИРОВАННОМ продукте (с++), и спор может разрешить только ссылка на стандарт.
таких случаев, "нелогичности" у с++, десятки, их надо просто знать.
именно поэтому с++, считается трудным. но взамен разработчик получает гораздо большую мошь
чем скажем игры в песочнице (java, delphi etc.)
Социальные закладки