คำถามติดแท็ก abi

(Application Binary Interface) ระบุอินเทอร์เฟซระดับต่ำระหว่างโปรแกรมไลบรารีและระบบปฏิบัติการ เช่นรีจิสเตอร์ที่ใช้ในการส่งผ่านพารามิเตอร์ฟังก์ชัน

5
มาตรฐาน C ++ อนุญาตให้บูลที่ไม่กำหนดค่าเริ่มต้นขัดข้องโปรแกรมหรือไม่
ฉันรู้ว่า"พฤติกรรมที่ไม่ได้กำหนด"ใน C ++ สามารถอนุญาตให้คอมไพเลอร์ทำสิ่งที่ต้องการได้ อย่างไรก็ตามฉันมีข้อผิดพลาดที่ทำให้ฉันประหลาดใจเพราะฉันคิดว่ารหัสนั้นปลอดภัยพอ ในกรณีนี้ปัญหาจริงเกิดขึ้นเฉพาะแพลตฟอร์มที่ใช้คอมไพเลอร์เฉพาะและเฉพาะในกรณีที่เปิดใช้งานการเพิ่มประสิทธิภาพ ฉันลองหลายสิ่งหลายอย่างเพื่อทำให้เกิดปัญหาอีกครั้งและทำให้มันง่ายขึ้นสูงสุด นี่คือการแยกฟังก์ชั่นที่เรียกSerializeว่าจะใช้พารามิเตอร์บูลและคัดลอกสตริงtrueหรือfalseไปยังบัฟเฟอร์ปลายทางที่มีอยู่ ฟังก์ชั่นนี้จะอยู่ในการตรวจสอบรหัสหรือไม่ไม่มีทางที่จะบอกได้ว่าในความเป็นจริงอาจมีปัญหาหากพารามิเตอร์ bool เป็นค่าเริ่มต้นหรือไม่ // Zero-filled global buffer of 16 characters char destBuffer[16]; void Serialize(bool boolValue) { // Determine which string to print based on boolValue const char* whichString = boolValue ? "true" : "false"; // Compute the length of the string we …

16
application binary interface (ABI) คืออะไร?
ฉันไม่เคยเข้าใจชัดเจนว่า ABI คืออะไร โปรดอย่านำฉันไปที่บทความ Wikipedia ถ้าฉันเข้าใจได้ฉันจะไม่โพสต์ข้อความยาว ๆ ที่นี่ นี่คือความคิดของฉันเกี่ยวกับอินเทอร์เฟซต่าง ๆ : รีโมตทีวีเป็นอินเทอร์เฟซระหว่างผู้ใช้กับทีวี เป็นนิติบุคคลที่มีอยู่ แต่ไร้ประโยชน์ (ไม่มีฟังก์ชั่นใด ๆ ) ด้วยตัวเอง ฟังก์ชั่นทั้งหมดสำหรับแต่ละปุ่มบนรีโมทนั้นมีการใช้งานในเครื่องรับโทรทัศน์ อินเทอร์เฟซ:เป็นเลเยอร์ "เอนทิตีที่มีอยู่" ระหว่าง functionalityและconsumerของฟังก์ชันการทำงานนั้น ส่วนต่อประสานไม่ได้ทำอะไรเลย มันแค่เรียกใช้ฟังก์ชั่นที่อยู่ข้างหลัง ตอนนี้ขึ้นอยู่กับผู้ใช้ที่มีอินเทอร์เฟซชนิดต่าง ๆ Command Line Interface (CLI)คำสั่งเป็นเอนทิตีที่มีอยู่ผู้บริโภคคือผู้ใช้และหน้าที่การใช้งานอยู่ด้านหลัง functionality: ฟังก์ชั่นซอฟต์แวร์ของฉันที่แก้จุดประสงค์บางอย่างที่เราอธิบายอินเตอร์เฟซนี้ existing entities: คำสั่ง consumer: ผู้ใช้งาน หน้าต่างส่วนต่อประสานกราฟิกกับผู้ใช้ (GUI)ปุ่มและอื่น ๆ เป็นสิ่งที่มีอยู่และอีกครั้งที่ผู้บริโภคคือผู้ใช้ functionality: ฟังก์ชั่นซอฟต์แวร์ของฉันที่แก้ปัญหาที่เราอธิบายอินเตอร์เฟซนี้ existing entities: หน้าต่างปุ่ม ฯลฯ consumer: ผู้ใช้งาน …

9
ความแตกต่างระหว่าง API และ ABI
ฉันใหม่เพื่อการเขียนโปรแกรมระบบลินุกซ์และฉันมาข้าม API และ ABI ในขณะที่อ่าน การเขียนโปรแกรมระบบลินุกซ์ คำจำกัดความของ API: API กำหนดอินเทอร์เฟซซึ่งซอฟต์แวร์ชิ้นหนึ่งสื่อสารกับอีกส่วนหนึ่งในระดับแหล่งที่มา คำจำกัดความของ ABI: ในขณะที่ API กำหนดอินเทอร์เฟซของแหล่งที่มา ABI กำหนดอินเทอร์เฟซแบบไบนารีระดับต่ำระหว่างซอฟต์แวร์สองชิ้นขึ้นไปบนสถาปัตยกรรมเฉพาะ มันกำหนดว่าแอปพลิเคชันโต้ตอบกับตัวเองอย่างไรแอปพลิเคชันโต้ตอบกับเคอร์เนลและแอปพลิเคชันโต้ตอบกับไลบรารีอย่างไร โปรแกรมสามารถสื่อสารในระดับแหล่งที่มาได้อย่างไร ระดับแหล่งที่มาคืออะไร? มันเกี่ยวข้องกับซอร์สโค้ดหรือไม่? หรือแหล่งที่มาของไลบรารีจะรวมอยู่ในโปรแกรมหลักหรือไม่ ข้อแตกต่างเดียวที่ฉันรู้คือ API ส่วนใหญ่จะใช้โดยโปรแกรมเมอร์และ ABI ส่วนใหญ่จะใช้โดยคอมไพเลอร์
194 api  abi 

10
มีข้อเสียในการผ่าน structs ตามค่าใน C แทนที่จะส่งตัวชี้หรือไม่?
มีข้อเสียในการผ่าน structs ตามค่าใน C แทนที่จะส่งตัวชี้หรือไม่? หาก struct มีขนาดใหญ่จะเห็นได้ชัดว่าการดำเนินการด้านการคัดลอกข้อมูลจำนวนมาก แต่สำหรับโครงสร้างที่มีขนาดเล็กก็ควรจะเหมือนกับการส่งผ่านค่าหลายค่าไปยังฟังก์ชัน มันอาจจะน่าสนใจยิ่งขึ้นเมื่อใช้เป็นค่าตอบแทน C มีค่าส่งคืนเดียวจากฟังก์ชัน แต่บ่อยครั้งที่คุณต้องการหลายค่า ดังนั้นวิธีง่ายๆคือใส่พวกมันไว้ในโครงสร้างและคืนสิ่งนั้น มีเหตุผลอะไรหรือขัดกับสิ่งนี้? เนื่องจากอาจไม่ชัดเจนสำหรับทุกคนที่ฉันกำลังพูดถึงที่นี่ฉันจะยกตัวอย่างง่ายๆ หากคุณกำลังเขียนโปรแกรมใน C คุณจะเริ่มเขียนฟังก์ชันที่มีลักษณะดังนี้: void examine_data(const char *ptr, size_t len) { ... } char *p = ...; size_t l = ...; examine_data(p, l); นี่ไม่ใช่ปัญหา ปัญหาเดียวคือคุณต้องเห็นด้วยกับเพื่อนร่วมงานของคุณซึ่งลำดับพารามิเตอร์ควรเป็นเช่นนั้นเพื่อให้คุณใช้หลักการเดียวกันในทุกฟังก์ชั่น แต่จะเกิดอะไรขึ้นเมื่อคุณต้องการส่งคืนข้อมูลประเภทเดียวกัน โดยปกติคุณจะได้รับสิ่งนี้: char *get_data(size_t *len); { ... *len = ...datalen...; …

4
อะไรคืออนุสัญญาการเรียกสำหรับระบบ UNIX & Linux ที่เรียกใช้ i386 และ x86-64
ลิงก์ต่อไปนี้อธิบายข้อตกลงการเรียกใช้ระบบ x86-32 สำหรับทั้ง UNIX (รสชาติ BSD) และ Linux: http://www.int80h.org/bsdasm/#system-calls http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html แต่อนุสัญญาการเรียกระบบ x86-64 บนทั้ง UNIX และ Linux คืออะไร?
147 linux  unix  assembly  x86-64  abi 

12
เหตุใดบูลีน 1 ไบต์และไม่ใช่ขนาด 1 บิต
ใน C ++ เหตุใดบูลีน 1 ไบต์และไม่ใช่ขนาด 1 บิต ทำไมไม่มีประเภทเช่นจำนวนเต็ม 4 บิตหรือ 2 บิต ฉันพลาดสิ่งต่างๆข้างต้นเมื่อเขียนโปรแกรมจำลองสำหรับ CPU

4
ฉันจะส่งผ่านวัตถุอย่างปลอดภัยโดยเฉพาะวัตถุ STL เข้าและออกจาก DLL ได้อย่างไร
ฉันจะส่งผ่านคลาสออบเจ็กต์โดยเฉพาะออบเจ็กต์ STL ไปยังและจาก C ++ DLL ได้อย่างไร แอปพลิเคชันของฉันต้องโต้ตอบกับปลั๊กอินของบุคคลที่สามในรูปแบบของไฟล์ DLL และฉันไม่สามารถควบคุมได้ว่าปลั๊กอินเหล่านี้สร้างขึ้นด้วยคอมไพเลอร์ใด ฉันทราบว่าไม่มี ABI ที่รับประกันสำหรับออบเจ็กต์ STL และฉันกังวลว่าจะทำให้แอปพลิเคชันของฉันไม่เสถียร
107 c++  windows  dll  stl  abi 

3
การเชื่อมโยงวัตถุ C ++ 17, C ++ 14 และ C ++ 11 นั้นปลอดภัยหรือไม่
สมมติว่าฉันมีออบเจ็กต์ที่คอมไพล์สามชิ้นทั้งหมดสร้างโดยคอมไพเลอร์ / เวอร์ชันเดียวกัน : A ถูกรวบรวมด้วยมาตรฐาน C ++ 11 B ถูกรวบรวมด้วยมาตรฐาน C ++ 14 C ถูกคอมไพล์ด้วยมาตรฐาน C ++ 17 เพื่อความเรียบง่ายสมมติว่าส่วนหัวทั้งหมดเขียนด้วย C ++ 11 โดยใช้เฉพาะโครงสร้างที่ความหมายไม่ได้เปลี่ยนแปลงระหว่างเวอร์ชันมาตรฐานทั้งสามดังนั้นการพึ่งพาระหว่างกันจึงถูกแสดงอย่างถูกต้องด้วยการรวมส่วนหัวและคอมไพเลอร์ไม่คัดค้าน การรวมกันของวัตถุเหล่านี้คืออะไรและไม่ปลอดภัยที่จะเชื่อมโยงเป็นไบนารีเดียว? ทำไม? แก้ไข: ยินดีต้อนรับคำตอบที่ครอบคลุมคอมไพเลอร์หลัก (เช่น gcc, clang, vs ++)
103 c++  c++11  linker  c++14  abi 

9
ทิศทางของการเติบโตแบบสแต็กในระบบสมัยใหม่ส่วนใหญ่เป็นอย่างไร?
ฉันกำลังเตรียมเอกสารการฝึกอบรมบางอย่างในภาษา C และฉันต้องการให้ตัวอย่างของฉันพอดีกับแบบจำลองกองซ้อนทั่วไป C stack เติบโตไปในทิศทางใดใน Linux, Windows, Mac OSX (PPC และ x86), Solaris และ Unixes ล่าสุด

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.