gcc c++ zahada
Miroslav Mraz
mrazik na volny.cz
Pondělí Březen 30 09:21:32 CEST 2020
To má dost divnou syntaxi. Spíš bych psal
constexpr static const uint16_t sms_handle_period_ = 30u;
a už vůbec nerozumím konstrukci
next_sms_handle += seconds{sms_handle_period_};
ale pokud je smysl
next_sms_handle += sms_handle_period_;
pak by to mělo fungovat. Constexpr se v C++ používá místo makra kvůli
lepší typové kontrole ale jestli se bez optimalizace rezervuje místo v
paměti netuším. Nemělo by se, constexpr by se mělo rozvinout vždy v
místě, kde je použito stejně jako makro. Samozřejmě to ale autoři
překladače můžou chápat jinak.
Nicméně kdysi jsem udělal rekurzívní výpočet faktoriálu jako constexpr a
pokud je to voláno s argumentem, který překladač v době překladu zná
(opět constexpr), pak tam žádný výpočet není, je nahrazen číslem
(výsledkem). Takže ten g++ je docela chytrý.
Mrazík
Dne 29. 03. 20 v 18:28 Jaroslav Buchta napsal(a):
> Zdravim, hrabu se v cizim kodu a narazil jsem na zajimavy problem.
>
> V objektu je definovana konstanta:
>
> private:
> constexpr static const uint16_t sms_handle_period_{30}; //
> seconds
>
> a ta pak pouzita v metode:
>
> void
> run()
> {
>
> ....
>
> if (now >= next_sms_handle)
> {
> next_sms_handle +=
> seconds{sms_handle_period_}; //chybovy odkaz je sem
> ...
>
>
> Pokud je zapnuta optimalizace O3, neni problem. Pokud vypnu optimalizace
> na O0, tak linker hlasi chybu:
>
> D:\Work\_Bednar_IOT\LinuxBuild\Workspace\Include/manager.h:210:
> undefined reference to `bednar::detail::manager::sms_handle_period_'
>
> Tusim, ze to bude tim, ze pri optimalizaci se pouzije rovnou konstanta
> 30 a pamet pro konstantu se vubec nevyhradi, bez optimalizace to bude
> brat z pameti.
>
> a dalsi indicie - jsou tam dalsi podobne definovane konstanty, ty jsou v
> metodach pouzity ve vyrazech a to je OK. Rozdil je tedy v tom, ze tady
> je to pouzito pro inicializaci objektu std::chrono::seconds
>
> Ted ale babo rad, proc vznika ta chyba? Prebornik v C++ nejsem ale co
> jsem se snazil nastudovat, melo by to snad takto fungovat?
>
>
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list