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

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


Мне одному кажется, что чтобы не было нужды вычислять вторую половину булевского выражения, надо или в doIt положить false, или заменить && на || ?
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[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: [?] Bash-изм на С++
От: koenjihyakkei Россия  
Дата: 09.01.22 13:26
Оценка: -1 :))
Здравствуйте, SchweinDeBurg, Вы писали:

Я бы на месте ТС удалил этот пост, а то мало ли будущий возможный работодатель увидит и на работу не возьмет
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);
}
Русский военный корабль идёт ко дну!
[?] 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[3]: [?] Bash-изм на С++
От: T4r4sB Россия  
Дата: 07.01.22 14:21
Оценка: +2
Здравствуйте, SchweinDeBurg, Вы писали:

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


На каком основании он должен выкинуть побочные эффекты?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: [?] Bash-изм на С++
От: RonWilson Россия  
Дата: 08.01.22 08:58
Оценка: +1 :)
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>SchweinDeBurg уже лет 12 как любитель красноглазить. Винду последний раз примерно тогда и видел.


Дык, я про это и говорю — всего-то 12 лет, MFC головного мозга — приставучая зараза
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
От: ArtDenis Россия  
Дата: 07.01.22 16:17
Оценка: -1
Здравствуйте, Alexander G, Вы писали:

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


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


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

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


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

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

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

Дело не в результате, а в побочном эффекте. pure-функция была бы выкинута.
Re[5]: А потому что эта глобальная переменная видна другим TU
От: Alexander G Украина  
Дата: 09.01.22 11:50
Оценка: +1
Здравствуйте, ononim, Вы писали:

O>То есть топикстартеру не понравилось наличие cmp в ассемблерном выхлопе компилятора, но рассказать об этом всем в пылу возмущения он забыл, а ты каким-то образом догадался? Какой провайдер в астралнет?


Ну, топикстартер возмутился отсутсвием оптимизации:

Даже с -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[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[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[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[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[3]: [?] Bash-изм на С++
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.01.22 18:03
Оценка:
Здравствуйте, Marty, Вы писали:

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


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


Это я знаю (поубивал бы за это!). Но там явно не тот случай.
Re[3]: [?] Bash-изм на С++
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.01.22 18:10
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

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


Любой оператор присваивания в C — это выражение, значение которого не используется. Любой вызов функции без присваивания — это выражение, значение которого не успользуется. Из этого не следует, что они не вычисляются.

Но вот конкретно про встроенные (не переопределенные) булевские операторы есть гарантия, что они вычисляются слева направо, и неиспользуемая правая часть не вычисляется.
Re[5]: [?] Bash-изм на С++
От: RonWilson Россия  
Дата: 07.01.22 18:10
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

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


SDB>Ну, я бы на его месте выкинул. Ладно, закроем тему, надо будет Стандарт покурить про этот момент поподробнее.


Вроде бы SchweinDeBurg любитель MFC, если не ошибаюсь, и вполне мог тайно увидеть такое, которое не имеет отношение к теме, но как раз было бы выкинуто в т.н. Release сборке:

bool TestIsLooksGood()
{
   ::MessageBoxW( 0, L"Aha!", L"AHA", MB_OK );
}

...

ASSERT( TestIsLooksGood() )
Re[6]: [?] Bash-изм на С++
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 08.01.22 08:56
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>Вроде бы SchweinDeBurg любитель MFC


SchweinDeBurg уже лет 12 как любитель красноглазить. Винду последний раз примерно тогда и видел.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re: [?] Bash-изм на С++
От: ononim  
Дата: 08.01.22 18:15
Оценка:
SDB>bool doIt = true;
SDB> doIt && std::cout << "Catch me if you can!" << std::endl;

'Суета это все' — хреновый критерий для оптимизатора. По такому критерию 99.99% софта компилятор мог бы компилировать в ret, а оставшийся 0.01% процент — это сам компилятор и то что ему требуется.
Есть стандарт, и в нем конкретно описано в каких случаях компилятор выкидывает код из булевых выражений. Это называется short-circuit evaluation и тут оно никак не могло выкинуть правое выражение по причинам на которые тут уже указали.
Как много веселых ребят, и все делают велосипед...
Re[4]: А потому что эта глобальная переменная видна другим TU
От: ononim  
Дата: 08.01.22 21:54
Оценка:
AD>>Бред же. Не выкидывает. И не должен. Точно народ перепраздновал.
AG>Выкидывает, вот дифф: https://godbolt.org/z/Gfj6zs5Kf
То есть топикстартеру не понравилось наличие cmp в ассемблерном выхлопе компилятора, но рассказать об этом всем в пылу возмущения он забыл, а ты каким-то образом догадался? Какой провайдер в астралнет?
Как много веселых ребят, и все делают велосипед...
Re[4]: [?] Bash-изм на С++
От: B0FEE664  
Дата: 11.01.22 08:34
Оценка:
Здравствуйте, Pzz, Вы писали:

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

Формально сохраняется: "распечатывается на бумаге". Откуда программе знать, что консоль не механическая?
И вообще:
./a.out > r.txt
И каждый день — без права на ошибку...
Re: [?] Bash-изм на С++
От: ути-пути Россия  
Дата: 14.01.22 11:38
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

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


По твоей логике, большинство программ можно свести к
int main()
{
  return 0;
}
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[5]: [?] Bash-изм на С++
От: vsb Казахстан  
Дата: 14.01.22 11:48
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

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


SDB>Ну, я бы на его месте выкинул. Ладно, закроем тему, надо будет Стандарт покурить про этот момент поподробнее.


Вы недавно на хаскеле не писали случаем? (:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.