Jon Jagger
jon@jaggersoft.com
Table of Contents 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Notes DownloadECMA-334 C# Language Specificationpreviousnextprevious at this levelnext at this level 25 Unsafe codeprevious at this levelnext at this level 25.7 Stack allocation Paragraph 11 In an unsafe context, a local variable declaration (§15.5.1) may include a stack allocation initializer, which allocates memory from the call stack. local-variable-initializer : expression array-initializer stackalloc-initializer stackalloc-initializer : stackalloc unmanaged-type [ expression ] Paragraph 21 The unmanaged-type indicates the type of the items that will be stored in the newly allocated location, and the expression indicates the number of these items. 2 Taken together, these specify the required allocation size. 3 Since the size of a stack allocation cannot be negative, it is a compile-time error to specify the number of items as a constant-expression that evaluates to a negative value. Paragraph 31 A stack allocation initializer of the form stackalloc T[E] requires T to be an unmanaged type (§25.2) and E to be an expression of type int. 2 The construct allocates E * sizeof(T) bytes from the call stack and returns a pointer, of type T*, to the newly allocated block. 3 If E is a negative value, then the behavior is undefined. 4 If E is zero, then no allocation is made, and the pointer returned is implementation-defined. 5 If there is not enough memory available to allocate a block of the given size, a System.StackOverflowException is thrown. Paragraph 41 The content of the newly allocated memory is undefined. Paragraph 51 Stack allocation initializers are not permitted in catch or finally blocks (§15.10). [Note: There is no way to explicitly free memory allocated using stackalloc. end note] 2 All stack-allocated memory blocks created during the execution of a function member are automatically discarded when that function member returns. [Note: This corresponds to the alloca function, an extension commonly found C and C++ implementations. end note] [Example: In the example
using System;  
class Test  
{  
   static string IntToString(int value) {  
      int n = value >= 0 ? value : -value;  
      unsafe {  
         char* buffer = stackalloc char[16];  
         char* p = buffer + 16;  
         do {  
            *--p = (char)(n % 10 + '0');  
            n /= 10;  
         } while (n != 0);  
         if (value < 0) *--p = '-';  
         return new string(p, 0, (int)(buffer + 16 - p));  
      }  
   }  
   static void Main() {  
      Console.WriteLine(IntToString(12345));  
      Console.WriteLine(IntToString(-999));  
   }  
}  
a stackalloc initializer is used in the IntToString method to allocate a buffer of 16 characters on the stack. The buffer is automatically discarded when the method returns. end example]
{ JSL }
Jagger Software Ltd
Company # 4070126
VAT # 762 5213 42
Valid HTML 4.01Valid CSS