Quantum По-моему _DEN_ прав. Если значение первого операнда определяет результат лог. оператора, то код вычисления второго операнда выполнен не будет. Микрософт это декларирует явно. При этом, если первый операнд может быть вычислен на этапе компиляции (оптимизация), то при сотв. его значении код вычисления второго операнда вообще не будет сгенерирован.
Вот код, который запостил г-н Loger: Код (Text): bool f(){return false;}; void main(){ if (f() && somefunc()){}; } green Естественно, но спор не об этом. Смотрите внимательнее пример!
Quantum Сорри, если я чего-то не понял - я подумал, что Вы не согласны с утверждением _DEN_: Решение о вычислении somefunc принимается в run-time, в этот момент результат вычисления f() известен, независимо инлайнил её компилер или нет. Эта стандартная оптимизация вычисления лог. операторов выполняется независимо от режима компиляции (т.е. настроек оптимизации конкретного компилятора).
green В рантайме somefunc не выполнит даже турбо-паскаль, если в опциях компиляции включить short-circuit, а любой стандартный с-компилятор использует эту опцию по умолчанию. Дело не в этом! Спор о том, должен ли стандартный (не оптимизирующий) с-компилятор опустить вызов somefunc вообще, т.е. чтоб и в коде этого вызова не было даже. Вопрос решается на этапе компиляции, а не в рантайме. _DEN_ Соль в том, что f - это функция, а не условие из примитивных типов данных.
стандарт говорит только о том должен ли быть ВЫЗОВ или нет. А что и в каком количестве включит в код компилятор - это его личная забота.
Quantum понял AFAIK, стандарт регламентирует только логику работы результирующего кода. В MS VC инлайн разрешён только в режиме оптимизации, и при компиляции с /Od код somefunc будет присутствовать.
интереcно, что при компиляции кода if (false && somefunc()) в режиме /Od компилятор все-таки опускает вызов somefunc, но выполняет проверку: xor eax, eax je ... явная непоследовательность... И что вообще такое абсолютно неоптимизированный код...
green Вот-вот! infern0 Значит вызов можно поместить в код, но предварительно позаботиться о том, чтобы он никогда не выполнился Согласен.
нет. достаточно скомпилировать нечто вроде: f: xor eax,eax ret ... call f or eax,eax jz go_after_if call somefunc or eax,eax jnz go_after_if if_here: ... go_after_if ... и это будет полностью соответствовать стандарту.
люди, а вы не могли бы мне показать, как можно пробежаться по памяти, полученной через указатель, возвращенный ф-цией GlobalAlloc, в который (в блок) был считан файл через ф-цию ReadFile, и проверить этот кусок памяти на наличие опред. послед-ти символов. допустим, 'y' и 'z'. само главно, нужно это сделать на Си++ , т.к. на асме я и сам могу=) а вот на си++ что-то запарился. не могу обратиться к содержимому этого полученного блока. пасиба.
IceStudent Мне понравился этот топ,да и на форуме и сайте много чего нового появилось и хотелось бы иметь в оффлайновом виде, обязательно ли ждать нового года чтобы появились новый версии таких замечательных вещей? all Прошу прощения за не втему
Я вот тут пытаюсь понять как комрад Александреску предлагает функторы реальзовывать... Вот это действительно изврат, у меня башка уже пухнет.
anarchisticmass Александреску - рИальный паЦЦан И не функции а обобщенные функторы. см. boost::function