[?] Bash-изм на С++
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.01.22 08:57
Оценка: :))
Хм-м-м, забавно, но факт...
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++ не выкидывает формально порожний код. 🙄
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Отредактировано 07.01.2022 8:57 SchweinDeBurg . Предыдущая версия .
Re: [?] Bash-изм на С++
От: kov_serg Россия  
Дата: 07.01.22 09:05
Оценка: +2 :)))
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>bool doIt = true;

SDB> doIt && std::cout << "Catch me if you can!" << std::endl;

SDB>Даже с -O3 G++ не выкидывает формально порожний код. 🙄

Вы видимо еще не отошли от праздников
Re[2]: [?] Bash-изм на С++
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.01.22 09:07
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вы видимо еще не отошли от праздников


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

P.S.
От праздников я еще 4 числа отошел, печенка не резиновая.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: [?] Bash-изм на С++
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.01.22 09:08
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, kov_serg, Вы писали:


_>>Вы видимо еще не отошли от праздников


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


SDB>P.S.

SDB>От праздников я еще 4 числа отошел, печенка не резиновая.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: [?] Bash-изм на С++
От: ArtDenis Россия  
Дата: 07.01.22 09:45
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>
SDB>bool doIt = true;
...
SDB>  doIt && std::cout << "Catch me if you can!" << std::endl;
...
SDB>




Реально, народ. Кончайте праздновать
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: [?] Bash-изм на С++
От: night beast СССР  
Дата: 07.01.22 09:57
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>А конкретнее? Я понимаю, что необходимо вычислить обе части &&, но результат-то потом никак не используется.


в выражении
std::cout << "Hello" << std::endl;
return 0;

результат первой строки тоже не используется. значит ли это что программа не должна ничего выводить?
Re: [?] Bash-изм на С++
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.01.22 11:32
Оценка: +7
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Даже с -O3 G++ не выкидывает формально порожний код. 🙄


Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?
Re[2]: [?] Bash-изм на С++
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.01.22 14:09
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?


Мой пойнт был в том, что формально там написано булево выражение, результат которого не только не используется, но даже нигде не сохраняется. И я был практически уверен, что оптимизатор такое должен выкинуть, вне зависимости от того, что именно является операндами &&.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: [?] Bash-изм на С++
От: T4r4sB Россия  
Дата: 07.01.22 14:21
Оценка: +2
Здравствуйте, SchweinDeBurg, Вы писали:

SDB> И я был практически уверен, что оптимизатор такое должен выкинуть, вне зависимости от того, что именно является операндами &&.


На каком основании он должен выкинуть побочные эффекты?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[4]: [?] Bash-изм на С++
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.01.22 14:31
Оценка: -1 :))
Здравствуйте, T4r4sB, Вы писали:

TB>На каком основании он должен выкинуть побочные эффекты?


Ну, я бы на его месте выкинул. Ладно, закроем тему, надо будет Стандарт покурить про этот момент поподробнее.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[2]: [?] Bash-изм на С++
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.01.22 14:43
Оценка:
Здравствуйте, Pzz, Вы писали:

SDB>>Даже с -O3 G++ не выкидывает формально порожний код. 🙄


Pzz>Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?


Если operator&& переопределён, то будет вычисляться полностью
Маньяк Робокряк колесит по городу
Re: А потому что эта глобальная переменная видна другим TU
От: Alexander G Украина  
Дата: 07.01.22 14:57
Оценка: 26 (1) +1
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Даже с -O3 G++ не выкидывает формально порожний код. 🙄


Потому что глобальная переменная, потенциально виндая в других единицах трансляции.
Глобальный конструктор другой единицы может переписать в false.

Вот так выкидывает:

#include <iostream>

namespace{
bool doIt = true;
}

int main(void)
{
  doIt && std::cout << "Catch me if you can!" << std::endl;
  return (0);
}
Русский военный корабль идёт ко дну!
Re[5]: [?] Bash-изм на С++
От: T4r4sB Россия  
Дата: 07.01.22 15:09
Оценка: +1
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Ну, я бы на его месте выкинул.


А в таком случае?

void foo() {
  true && call_api();
}

Не очень понятно, с чего ты взял, что можно выкидывать вызов внешнего АПИ?

Или так:

void foo() {
  int x = 0;
  true && (x = 1, true);
  if (x == 1) ...
}

Тут тоже можно выкидывать? Ведь результат не используется. Только логика исполнения поменяется, но тебе это пофиг же?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[2]: А потому что эта глобальная переменная видна другим TU
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 07.01.22 15:12
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Потому что глобальная переменная, потенциально виндая в других единицах трансляции.

AG>Глобальный конструктор другой единицы может переписать в false.

А вот это уже по делу, дякую!
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[3]: А потому что эта глобальная переменная видна другим TU
От: Alexander G Украина  
Дата: 07.01.22 15:59
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>А вот это уже по делу, дякую!


Перечитал ветку, на всякий случай ещё уточню.

В случае статического связывания, анонимного пространства имён или локальной переменной, компилятор выкинет само обращение к doIt.
Но результат программы будет тот же: https://godbolt.org/z/cx5P5q7bM

С точки зрения as-if правила, вывод в консоль является побочным эффектом, который выкинуть нельзя.
Русский военный корабль идёт ко дну!
Re[2]: А потому что эта глобальная переменная видна другим TU
От: ArtDenis Россия  
Дата: 07.01.22 16:17
Оценка: -1
Здравствуйте, Alexander G, Вы писали:

AG>Вот так выкидывает:


AG>
AG>namespace{
AG>bool doIt = true;
AG>}
AG>


Бред же. Не выкидывает. И не должен. Точно народ перепраздновал.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: А потому что эта глобальная переменная видна другим TU
От: Alexander G Украина  
Дата: 07.01.22 16:38
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>Бред же. Не выкидывает. И не должен. Точно народ перепраздновал.


Выкидывает, вот дифф: https://godbolt.org/z/Gfj6zs5Kf

Другое дело какой эффект от этого ожидать. Разумеется, "Catch me if you can!" всё равно выведется.
Русский военный корабль идёт ко дну!
Re[4]: А потому что эта глобальная переменная видна другим TU
От: ArtDenis Россия  
Дата: 07.01.22 16:47
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Другое дело какой эффект от этого ожидать. Разумеется, "Catch me if you can!" всё равно выведется.


Ну речь-то тут идёт про вывод "Catch me if you can!" на консоль. А оно как выводилось, так и выводится.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: А потому что эта глобальная переменная видна другим TU
От: Alexander G Украина  
Дата: 07.01.22 16:53
Оценка: +1
Здравствуйте, ArtDenis, Вы писали:

AD>Ну речь-то тут идёт про вывод "Catch me if you can!" на консоль.


Ну если так то да.
Из-за упоминания -O3 я изначально воспринял вопрос как "что препятствует оптимизации, устраняющей лишнюю переменную (с сохранением ожидаемого поведения)?"
Русский военный корабль идёт ко дну!
Re[3]: [?] Bash-изм на С++
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.01.22 18:03
Оценка:
Здравствуйте, Marty, Вы писали:

Pzz>>Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?


M>Если operator&& переопределён, то будет вычисляться полностью


Это я знаю (поубивал бы за это!). Но там явно не тот случай.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.