Odpověď na názor

Odpovídáte na názor ke článku Destructive Move v C++?.

  • 6. 7. 2025 16:09

    Daniel Hryzbil

    Za mě by klidně mohlo existovat pravidlo, že callee vždy zajistí destrukci všech "moved" (rvalue) argumentů. Problém jsou Céčkové variadické funkce, kde callee ani neví, co vlastně dostal jako argumenty. Kompilátor by sice mohl takovou situaci detekovat a označit za chybu, ale není to ideální. Možná proto se autoři C++ standardu rozhodli vydat jinou cestou, takže destrukci argumentů zajišťuje caller.

    Každopádně souhlasím s názorem výše, že calling conventions nemají vliv na destructive move. Stack cleanup klidně může provádět caller a volání destruktoru callee. Navíc na moderních architekturách se argumenty často vejdou do registrů, takže explicitní stack cleanup ani není potřeba.

    Jinak stdcall se stále používá, protože jinak by nešlo volat WinAPI, kde většina funkcí je stdcall. Pozor na to, že cdecl a stdcall jsou záležitost pouze 32-bit x86 (IA-32). Na dnes běžnějším 64-bit x86 (x86-64) a ostatních 64-bit architekturách se zpravidla používá jen jedna calling convention, kde stack cleanup provádí caller, protože jinak nelze implementovat Céčkové variadické funkce.

    Microsoft má na 32-bit x86 také ještě thiscall pro member funkce (pokud nejsou variadické). Je to podobné jako jejich oblíbený stdcall, takže stack cleanup provádí callee, jen se navíc "this" pointer předává v ECX registru a ne na stacku s ostatními argumenty.

    Všechno je to hezky popsané na Wikipedii: https://en.wikipedia.org/wiki/X86_calling_conventions