คำถามติดแท็ก calling-convention

8
__stdcall คืออะไร
ฉันเรียนรู้เกี่ยวกับการเขียนโปรแกรม Win32 และWinMainต้นแบบดูเหมือนว่า: int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show ) ฉันสับสนว่าWINAPIตัวระบุนี้ใช้สำหรับอะไรและพบว่า: #define WINAPI __stdcall สิ่งนี้ทำอะไร ฉันสับสนโดยการมีบางอย่างหลังจากกลับมาประเภท มี__stdcallไว้เพื่ออะไร มันหมายความว่าอย่างไรเมื่อมีบางอย่างระหว่างชนิดที่ส่งคืนและชื่อฟังก์ชัน

4
เหตุใด Windows64 จึงใช้รูปแบบการโทรที่แตกต่างจาก OS อื่น ๆ ทั้งหมดบน x86-64
AMD มีข้อกำหนด ABI ที่อธิบายถึงรูปแบบการโทรที่จะใช้บน x86-64 ระบบปฏิบัติการทั้งหมดทำตามยกเว้น Windows ที่มีรูปแบบการโทร x86-64 ของตัวเอง ทำไม? มีใครรู้เหตุผลทางเทคนิคประวัติศาสตร์หรือการเมืองสำหรับความแตกต่างนี้หรือเป็นเรื่องของ NIHsyndrome หรือไม่? ผมเข้าใจว่าระบบปฏิบัติการที่แตกต่างกันอาจมีความต้องการที่แตกต่างกันสำหรับสิ่งที่ระดับที่สูงขึ้น แต่ไม่ได้อธิบายว่าทำไมเช่นพารามิเตอร์การลงทะเบียนผ่านการสั่งซื้อบน Windows คือในขณะที่คนอื่นใช้ทุกคนrcx - rdx - r8 - r9 - rest on stackrdi - rsi - rdx - rcx - r8 - r9 - rest on stack ปล. ฉันทราบดีว่ารูปแบบการโทรเหล่านี้แตกต่างกันอย่างไรและฉันรู้ว่าจะหารายละเอียดได้จากที่ใดหากต้องการ สิ่งที่ฉันต้องการรู้คือทำไม แก้ไข: สำหรับวิธีการดูเช่นรายการวิกิพีเดียและลิงก์จากที่นั่น

7
callstack ทำงานอย่างไร?
ฉันพยายามทำความเข้าใจให้ลึกซึ้งยิ่งขึ้นว่าการทำงานของภาษาโปรแกรมระดับต่ำทำงานอย่างไรและโดยเฉพาะอย่างยิ่งวิธีที่พวกเขาโต้ตอบกับ OS / CPU ฉันอาจอ่านทุกคำตอบในทุกเธรดที่เกี่ยวข้องกับสแต็ก / ฮีปที่นี่ใน Stack Overflow และพวกเขาทั้งหมดยอดเยี่ยม แต่ยังมีสิ่งหนึ่งที่ฉันยังไม่เข้าใจ พิจารณาฟังก์ชันนี้ในรหัสหลอกซึ่งมีแนวโน้มที่จะเป็นรหัสสนิมที่ถูกต้อง ;-) fn foo() { let a = 1; let b = 2; let c = 3; let d = 4; // line X doSomething(a, b); doAnotherThing(c, d); } นี่คือวิธีที่ฉันถือว่าสแต็กมีลักษณะเป็นบรรทัด X: Stack a +-------------+ | 1 | b +-------------+ …

4
เหตุใดจึงสามารถส่ง T * ในการลงทะเบียน แต่ unique_ptr <T> ไม่สามารถทำได้?
ฉันกำลังดูการสนทนาของ Chandler Carruth ใน CppCon 2019: ไม่มี Abstractions Zero-Cost ในนั้นเขาให้ตัวอย่างของวิธีการที่เขารู้สึกประหลาดใจเพียงเท่าใดค่าใช้จ่ายที่คุณเกิดขึ้นโดยใช้std::unique_ptr&lt;int&gt;มากกว่าint*; ส่วนนั้นเริ่มต้นที่เวลา 17:25 น คุณสามารถดูผลการรวบรวมตัวอย่างของคู่ของเขา (godbolt.org) - เพื่อเป็นพยานว่าที่จริงดูเหมือนว่าคอมไพเลอร์ไม่เต็มใจที่จะผ่านค่า unique_ptr - ซึ่งในความเป็นจริงในบรรทัดล่างคือ เพียงที่อยู่ - ภายในการลงทะเบียนเท่านั้นในหน่วยความจำแบบตรง หนึ่งในประเด็นที่นายคาร์รั ธ ทำเวลาประมาณ 27:00 น. คือ C ++ ABI ต้องการพารามิเตอร์ตามค่า (บางส่วน แต่ไม่ใช่ทั้งหมดบางทีอาจเป็น - ประเภทที่ไม่ใช่แบบดั้งเดิมหรือไม่ใช่ประเภทที่ไม่สามารถแก้ไขได้) จะถูกส่งผ่านในหน่วยความจำ มากกว่าภายในทะเบียน คำถามของฉัน: นี่เป็นข้อกำหนดของ ABI ในบางแพลตฟอร์มหรือไม่ (อันไหน) หรือบางทีมันอาจเป็นเพียงการมองโลกในแง่ร้ายในบางสถานการณ์? เหตุใด ABI จึงเป็นเช่นนั้น นั่นคือถ้าเขตข้อมูลของโครงสร้าง / …

1
เหตุใดจึงมีการจัดสรรหน่วยความจำสแต็คเมื่อไม่ใช้
ลองพิจารณาตัวอย่างต่อไปนี้: struct vector { int size() const; bool empty() const; }; bool vector::empty() const { return size() == 0; } รหัสการประกอบที่สร้างขึ้นสำหรับvector::empty(โดยเสียงดังกราวด้วยการเพิ่มประสิทธิภาพ): push rax call vector::size() const test eax, eax sete al pop rcx ret ทำไมมันจัดสรรพื้นที่สแต็ค? มันไม่ได้ใช้เลย pushและpopอาจถูกมองข้าม บิลด์ที่ปรับให้เหมาะสมของ MSVC และ gcc ยังใช้พื้นที่สแต็กสำหรับฟังก์ชั่นนี้ (ดูที่godbolt ) ดังนั้นต้องมีเหตุผล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.