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

7
วัตถุประสงค์ของการสแต็คคืออะไร? ทำไมเราต้องการมัน?
ดังนั้นฉันกำลังเรียนรู้ MSIL ในขณะนี้เพื่อเรียนรู้การดีบักแอปพลิเคชัน C # .NET ของฉัน ฉันสงสัยอยู่เสมอ: จุดประสงค์ของกองคืออะไร เพียงใส่คำถามของฉันในบริบท: เหตุใดจึงมีการถ่ายโอนจากหน่วยความจำไปกองหรือ "โหลด" ในทางกลับกันเหตุใดจึงมีการถ่ายโอนจากสแต็คไปยังหน่วยความจำหรือ "การจัดเก็บ" ทำไมไม่เพียงแค่วางมันทั้งหมดไว้ในหน่วยความจำ? เป็นเพราะมันเร็วกว่าไหม เป็นเพราะแรมใช้หรือไม่ เพื่อประสิทธิภาพ? ฉันพยายามเข้าใจสิ่งนี้เพื่อช่วยให้ฉันเข้าใจรหัสCILอย่างลึกซึ้งยิ่งขึ้น
320 c#  .net  vb.net  cil  .net-assembly 

20
คุณสามารถทำอะไรใน MSIL ที่คุณไม่สามารถทำได้ใน C # หรือ VB.NET [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องการอภิปรายการโต้แย้งการหยั่งเสียงหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา รหัสทั้งหมดที่เขียนใน. NET ภาษารวบรวม MSIL แต่มีงานเฉพาะ / การดำเนินงานที่คุณสามารถทำได้เพียงใช้ MSIL โดยตรงหรือไม่ ให้เราทำสิ่งต่าง ๆ ได้ง่ายขึ้นใน MSIL กว่า C #, VB.NET, F #, j # หรือภาษา NET อื่น ๆ จนถึงตอนนี้เรามีสิ่งนี้: หางเรียกซ้ำ Generic Co / Contravariance เกินพิกัดที่แตกต่างกันเฉพาะในประเภทผลตอบแทน แทนที่ตัวดัดแปลงการเข้าถึง มีคลาสที่ไม่สามารถสืบทอดจาก System.Object ข้อยกเว้นที่กรอง (สามารถทำได้ใน vb.net) การเรียกใช้วิธีเสมือนของชนิดคลาสคงที่ปัจจุบัน รับการจัดการกับชนิดของค่าชนิดบรรจุกล่อง ลอง / …
165 c#  .net  clr  cil 

1
ทำไมคอมไพเลอร์ C # จึงแปลสิ่งนี้! = การเปรียบเทียบราวกับว่าเป็นการเปรียบเทียบ>
ฉันมีโอกาสบริสุทธิ์ค้นพบว่าคอมไพเลอร์ C # เปลี่ยนวิธีนี้: static bool IsNotNull(object obj) { return obj != null; } ... เข้าสู่CILนี้: .method private hidebysig static bool IsNotNull(object obj) cil managed { ldarg.0 // obj ldnull cgt.un ret } …หรือหากคุณต้องการดูรหัส C # ที่ถอดรหัสแล้ว: static bool IsNotNull(object obj) { return obj > null; // (note: this is …
147 c#  cil  il  notnull  binary-operators 

5
Java Virtual Machine และ CLR
ตามประเภทคำถามที่เรียกว่าความแตกต่างระหว่าง MSIL และ Java bytecode อะไรคือความแตกต่าง (หลัก) หรือความคล้ายคลึงกันในการทำงานของ Java Virtual Machine กับวิธีการ. NET Framework Common Language Runtime (CLR) ใช้งานได้? นอกจากนี้ยังเป็น กรอบงาน. NET CLR เป็น "เครื่องเสมือน" หรือไม่มีคุณลักษณะของเครื่องเสมือนหรือไม่

9
แทนที่เนื้อหาของวิธี C # แบบไดนามิก?
สิ่งที่ฉันต้องการทำคือเปลี่ยนวิธีการดำเนินการของ C # เมื่อมีการเรียกเพื่อให้ฉันสามารถเขียนสิ่งนี้ได้: [Distributed] public DTask<bool> Solve(int n, DEvent<bool> callback) { for (int m = 2; m < n - 1; m += 1) if (m % n == 0) return false; return true; } ในขณะรันไทม์ฉันต้องสามารถวิเคราะห์เมธอดที่มีแอตทริบิวต์ Distributed (ซึ่งฉันทำได้อยู่แล้ว) จากนั้นใส่โค้ดก่อนที่เนื้อหาของฟังก์ชันจะดำเนินการและหลังจากที่ฟังก์ชันกลับมา ที่สำคัญกว่านั้นคือฉันต้องสามารถทำได้โดยไม่ต้องแก้ไขโค้ดที่มีการเรียกใช้การแก้ปัญหาหรือเมื่อเริ่มต้นฟังก์ชัน (ในเวลาคอมไพล์การทำเช่นนั้นในเวลาทำงานเป็นวัตถุประสงค์) ในขณะนี้ฉันได้ลองใช้บิตของโค้ดนี้แล้ว(สมมติว่า t เป็นประเภทที่มีการแก้ปัญหาและ m คือ MethodInfo ของการแก้ปัญหา) : …
114 c#  methods  assemblies  cil  swap 

3
เหตุใดเงื่อนไข (null ||! tryParse) จึงทำให้เกิด "การใช้ตัวแปรภายในที่ไม่ได้กำหนด"
โค้ดต่อไปนี้ส่งผลให้ใช้ตัวแปรโลคัล "numberOfGroups" ที่ไม่ได้กำหนด : int numberOfGroups; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } อย่างไรก็ตามรหัสนี้ใช้งานได้ดี (แม้ว่าReSharperกล่าวว่า= 10ซ้ำซ้อน): int numberOfGroups = 10; if(options.NumberOfGroups == null || !int.TryParse(options.NumberOfGroups, out numberOfGroups)) { numberOfGroups = 10; } ฉันขาดอะไรไปหรือคอมไพเลอร์ไม่ชอบของฉัน||? ฉันได้ จำกัด สิ่งนี้ให้แคบลงจนdynamicทำให้เกิดปัญหา ( optionsเป็นตัวแปรแบบไดนามิกในโค้ดด้านบนของฉัน) คำถามยังคงอยู่ทำไมฉันถึงทำสิ่งนี้ไม่ได้? รหัสนี้ไม่ได้รวบรวม: internal class Program { #region …

4
ประสิทธิภาพที่แปลกประหลาดเพิ่มขึ้นในเกณฑ์มาตรฐานอย่างง่าย
เมื่อวานฉันพบบทความของ Christoph Nahr ชื่อ ".NET Struct Performance" ซึ่งเปรียบเทียบหลายภาษา (C ++, C #, Java, JavaScript) สำหรับวิธีการที่เพิ่มโครงสร้างสองจุด ( doubletuples) ตามที่ปรากฏเวอร์ชัน C ++ ใช้เวลาประมาณ 1,000ms ในการดำเนินการ (การทำซ้ำ 1e9) ในขณะที่ C # ไม่สามารถทำงานได้ต่ำกว่า ~ 3000ms ในเครื่องเดียวกัน (และทำงานได้แย่กว่าใน x64) เพื่อทดสอบด้วยตัวเองฉันใช้รหัส C # (และทำให้ง่ายขึ้นเล็กน้อยเพื่อเรียกเฉพาะเมธอดที่มีการส่งผ่านพารามิเตอร์ด้วยค่า) และรันบนเครื่อง i7-3610QM (บูสต์ 3.1Ghz สำหรับคอร์เดียว), RAM 8GB, Win8 1 โดยใช้. NET 4.5.2, …



7
มีคำอธิบายสำหรับตัวดำเนินการแบบอินไลน์ใน“ k + = c + = k + = c;” หรือไม่
คำอธิบายสำหรับผลลัพธ์จากการดำเนินการต่อไปนี้คืออะไร? k += c += k += c; ฉันพยายามทำความเข้าใจผลลัพธ์ผลลัพธ์จากรหัสต่อไปนี้: int k = 10; int c = 30; k += c += k += c; //k=80 instead of 110 //c=70 และตอนนี้ฉันกำลังพยายามทำความเข้าใจว่าทำไมผลลัพธ์ของ "k" จึงเป็น 80 ทำไมการกำหนด k = 40 จึงไม่ทำงาน (จริงๆแล้ว Visual Studio บอกฉันว่าไม่มีการใช้ค่านั้นที่อื่น) ทำไม k 80 ถึงไม่ใช่ 110? ถ้าฉันแยกการดำเนินการเป็น: k+=c; c+=k; …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.