Size: a a a

2020 May 24

MM

Mikhail Matrosov in pro.cxx
vehlwn
std::optional<Image> opt = getImage();
const Image image = std::move(*opt);

Зачем тут статик и констекспр?
тут мы очевидно не можем
источник

v

vehlwn in pro.cxx
Mikhail Matrosov
нет. скорее так: если мы можем сделать переменную static constexpr, то следует это сделать
Если можете - делайте. А вопрос то в чем?
источник

MM

Mikhail Matrosov in pro.cxx
Neargye
> пропозал уже есть
можете показать? мне было бы полезно)
да, щас поищу, потерял ссылку
источник

N

Neargye in pro.cxx
Mikhail Matrosov
да, щас поищу, потерял ссылку
Спасибо
источник

MM

Mikhail Matrosov in pro.cxx
vehlwn
Если можете - делайте. А вопрос то в чем?
в том, что я вот могу отрубить себе руку и выстрелить в ногу. но полезно ли это ? ))
источник

v

vehlwn in pro.cxx
Mikhail Matrosov
в том, что я вот могу отрубить себе руку и выстрелить в ногу. но полезно ли это ? ))
На size-1 у пустого вектора тоже можно оторвать руки и ноги. Я не понимаю мотивацию.
источник

N

Neargye in pro.cxx
Mikhail Matrosov
в том, что я вот могу отрубить себе руку и выстрелить в ногу. но полезно ли это ? ))
static const - с не тривиальными деструкторами может добавить боли.
источник

v

vehlwn in pro.cxx
Mikhail Matrosov
А вот господа академики, накиньте-ка на вентилятор. Вот я хочу сформулировать рекомендацию: если заводишь локальную константу, то объявляй её как static constexpr, а не просто constexpr или const. Например:

int foo1() {
   static constexpr std::array v = { 1, 2, 3 };
   return bar(v);
}


Почему это важно? Потому что если её объявить просто constexpr, то компилятор будет обязан создавать новый объект, если bar принимает параметр по ссылке: https://gcc.godbolt.org/z/yHTSnf

Для фундаментальных типов это менее актуально, но всё равно возможно. Если bar это объявление шаблона без тела, например.

Плюсы вроде понятны. А какие минусы? Во-первых, лишнее слово. Во-вторых, может быть какая-то доп. работа на этапе старта программы. Но мне казалась, что там просто память должна зарезервироваться и всё. Может как-то может повлиять на размер бинаря? Что-то ещё?
А еще статик инициализирует переменную под мьютексом, поэтому сторонники преждевременных оптимизаций: умирают.
источник

AZ

Alexander Zaitsev in pro.cxx
vehlwn
А еще статик инициализирует переменную под мьютексом, поэтому сторонники преждевременных оптимизаций: умирают.
а компиляторы это дело умеют оптимизировать, кстати?
источник

А

Андрей in pro.cxx
Alexander Zaitsev
а компиляторы это дело умеют оптимизировать, кстати?
constexpr конструктор?
источник

v

vehlwn in pro.cxx
Alexander Zaitsev
а компиляторы это дело умеют оптимизировать, кстати?
Я не знаю. Может флаг заводят как с опшиналом - есть или нет значения.
источник

AZ

Alexander Zaitsev in pro.cxx
нет, инициализацию статиков под мьютексом, когда программа у меня однопоточная, например
источник

А

Андрей in pro.cxx
такую бы оптимизацию в шейред птр тоже , если программа однопоточная
источник

AZ

Alexander Zaitsev in pro.cxx
но такого скорее всего нет :(
источник

v

vehlwn in pro.cxx
Alexander Zaitsev
нет, инициализацию статиков под мьютексом, когда программа у меня однопоточная, например
Нет. __cxa_guard_acquire
https://godbolt.org/z/5HXCs3
источник

AZ

Alexander Zaitsev in pro.cxx
эх, грусть
источник

v

vehlwn in pro.cxx
Alexander Zaitsev
эх, грусть
std::async же может нитки спавнить. Как компелятор должен догадаться, что твоя программа однопоточная?
источник

А

Андрей in pro.cxx
vehlwn
std::async же может нитки спавнить. Как компелятор должен догадаться, что твоя программа однопоточная?
флажком?)
источник

DF

Dollar Føølish in pro.cxx
Много ли вы видели однопоточных программ которым была бы полезна такая оптимизация?
источник

DF

Dollar Føølish in pro.cxx
Лаба2.схх с 300% ускорения ?
источник