मैं हाल ही में डेव डेटलेफ़ द्वारा this article पढ़ रहा था जिसमें वह कुछ मामलों को प्रस्तुत करता है जहां सीएलआर सरणी सीमाओं को समाप्त करने की जांच करता है। मैं इस अपने आप को परीक्षण करने का फैसला, तो मैं निम्नलिखित किया:एआरई बाउंड सीएलआर में उन्मूलन की जांच करें?
- खोला विजुअल स्टूडियो 2010 अंतिम SP1
- बनाया प्रकार का एक नया सी # परियोजना कंसोल अनुप्रयोग (लक्षित कर डिफ़ॉल्ट रूप से .NET 4 ग्राहकों का प्रोफाइल)
जोड़ा निम्नलिखित कोड (सभी उप-तरीकों लेख से सीधे लिया जाता है):
class Program { static void Main(string[] args) { int[] array = new int[30]; Test_SimpleAscend(array); Test_SimpleRedundant(array, 3); foreach (int i in array) { Console.WriteLine(i); } } static void Test_SimpleAscend(int[] a) { for (int i = 0; i < a.Length; i++) a[i] = i; } static void Test_SimpleRedundant(int[] a, int i) { int k = a[i]; k = k + a[i]; } }
मोड रिलीज पर स्विच किया गया; सत्यापित किया है कि "अनुकूलन कोड" विकल्प बिल्ड
- जोड़ा प्रत्येक सरणी का उपयोग करने के लिए एक ब्रेकपाइंट, डिबगिंग (F5) शुरू कर दिया में चेक किया गया है और Dissassembly विंडो खोली
तो यहाँ के लिए dissassembly है एक [i] = मैं; Test_SimpleAscend में:
a[i] = i;
00000024 mov eax,dword ptr [ebp-4]
00000027 mov edx,dword ptr [ebp-8]
0000002a cmp eax,dword ptr [edx+4]
0000002d jb 00000034
0000002f call 64FD6E08
00000034 mov ecx,dword ptr [ebp-4]
00000037 mov dword ptr [edx+eax*4+8],ecx
सीएमपी/जेबी/कॉल सीमा चेकिंग, वास्तव में कॉल के लिए मजबूर कर निष्पादित करने के लिए एक IndexOutOfRangeException फेंकता है।
टेस्ट_SimpleRedundant में अनावश्यक पहुंच सहित सभी सरणी एक्सेसों के लिए वही बात। तो क्या मेरी परीक्षण पद्धति में कुछ गड़बड़ है, या सीएलआर वास्तव में सीमाओं की जांच को खत्म नहीं करता है? मुझे उम्मीद है कि मैं गलत हूं और यदि ऐसा है तो मैं जानना चाहता हूं कि मैं वास्तव में उन्मूलन की जांच कैसे कर सकता हूं।
डिफ़ॉल्ट रूप से, JIT अनुकूलन जब डिबगिंग अक्षम हैं:
जब आप "डीबगिंग शुरू करना" कहते हैं, तो मुझे लगता है कि आपने विजुअल स्टूडियो पर्यावरण से * डीबगर संलग्न * के साथ एप्लिकेशन * लॉन्च किया है। उस स्थिति में, आपको यह सुनिश्चित करना होगा कि जेआईटी संकलन सक्षम है क्योंकि यह डिफ़ॉल्ट रूप से नहीं है। जेआईटी कंपाइलर वह है जो इस अनुकूलन को करता है, सी # कंपाइलर नहीं। –
सीमा शुल्क जांच अक्षम होने पर आप क्या होने की उम्मीद करते हैं? यह आमतौर पर एक विशेषता है जो लोगों को सी # जैसी प्रबंधित भाषा का उपयोग करते समय होने की उम्मीद है। –
अनुकूलन सुनिश्चित करने का सबसे आसान तरीका वास्तव में डिबगिंग के बिना एप्लिकेशन को प्रारंभ करने के लिए सक्षम है और फिर इसे डीबगर संलग्न करें। – svick