Odpovídáte na názor ke článku Destructive Move v C++?.
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
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 57 593×
Přečteno 27 720×
Přečteno 26 401×
Přečteno 24 367×
Přečteno 22 864×