elijah@confident.ru [~] $ cat test.cpp
#include <iostream>
bool doIt = true;
int main(void)
{
doIt && std::cout << "Catch me if you can!" << std::endl;
return (0);
}
elijah@confident.ru [~] $ g++ -O3 test.cpp
elijah@confident.ru [~] $ ./a.out
Catch me if you can!
Даже с -O3 G++ не выкидывает формально порожний код. 🙄
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>bool doIt = true; SDB> doIt && std::cout << "Catch me if you can!" << std::endl;
SDB>Даже с -O3 G++ не выкидывает формально порожний код. 🙄
Вы видимо еще не отошли от праздников
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, kov_serg, Вы писали:
_>>Вы видимо еще не отошли от праздников
SDB>А конкретнее? Я понимаю, что необходимо вычислить обе части &&, но результат-то потом никак не используется и даже не сохраняется.
SDB>P.S. SDB>От праздников я еще 4 числа отошел, печенка не резиновая.
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>А конкретнее? Я понимаю, что необходимо вычислить обе части &&, но результат-то потом никак не используется.
в выражении
std::cout << "Hello" << std::endl;
return 0;
результат первой строки тоже не используется. значит ли это что программа не должна ничего выводить?
Здравствуйте, Pzz, Вы писали:
Pzz>Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?
Мой пойнт был в том, что формально там написано булево выражение, результат которого не только не используется, но даже нигде не сохраняется. И я был практически уверен, что оптимизатор такое должен выкинуть, вне зависимости от того, что именно является операндами &&.
Здравствуйте, SchweinDeBurg, Вы писали:
SDB> И я был практически уверен, что оптимизатор такое должен выкинуть, вне зависимости от того, что именно является операндами &&.
На каком основании он должен выкинуть побочные эффекты?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Pzz, Вы писали:
SDB>>Даже с -O3 G++ не выкидывает формально порожний код. 🙄
Pzz>Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?
Если operator&& переопределён, то будет вычисляться полностью
Здравствуйте, Alexander G, Вы писали:
AG>Потому что глобальная переменная, потенциально виндая в других единицах трансляции. AG>Глобальный конструктор другой единицы может переписать в false.
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>А вот это уже по делу, дякую!
Перечитал ветку, на всякий случай ещё уточню.
В случае статического связывания, анонимного пространства имён или локальной переменной, компилятор выкинет само обращение к doIt.
Но результат программы будет тот же: https://godbolt.org/z/cx5P5q7bM
С точки зрения as-if правила, вывод в консоль является побочным эффектом, который выкинуть нельзя.
Русский военный корабль идёт ко дну!
Re[2]: А потому что эта глобальная переменная видна другим TU
Здравствуйте, ArtDenis, Вы писали:
AD>Ну речь-то тут идёт про вывод "Catch me if you can!" на консоль.
Ну если так то да.
Из-за упоминания -O3 я изначально воспринял вопрос как "что препятствует оптимизации, устраняющей лишнюю переменную (с сохранением ожидаемого поведения)?"
Здравствуйте, Marty, Вы писали:
Pzz>>Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?
M>Если operator&& переопределён, то будет вычисляться полностью
Это я знаю (поубивал бы за это!). Но там явно не тот случай.