
25 Unsafe code
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]
| |
| Jagger Software Ltd | |
| Company # 4070126 | |
| VAT # 762 5213 42 |