У меня есть несколько вопросов о функциональности оператора stackalloc
.
-
Как это распределяется? Я думал, что это что-то вроде:
void* stackalloc(int sizeInBytes) { void* p = StackPointer (esp); StackPointer += sizeInBytes; if(StackPointer exceeds stack size) throw new StackOverflowException(...); return p; }
Но я сделал несколько тестов, и я не уверен, как это работает. Мы не можем точно знать, что он делает и как он это делает, но я хочу знать основы.
-
Я думал, что распределение стека (ну, я действительно уверен в этом) быстрее, чем распределение кучи. Итак, почему этот пример:
class Program { static void Main(string[] args) { Stopwatch sw1 = new Stopwatch(); sw1.Start(); StackAllocation(); Console.WriteLine(sw1.ElapsedTicks); Stopwatch sw2 = new Stopwatch(); sw2.Start(); HeapAllocation(); Console.WriteLine(sw2.ElapsedTicks); } static unsafe void StackAllocation() { for (int i = 0; i < 100; i++) { int* p = stackalloc int[100]; } } static void HeapAllocation() { for (int i = 0; i < 100; i++) { int[] a = new int[100]; } } }
дает средние результаты 280 ~ тиков для распределения стека и обычно 1-0 тиков для распределения кучи? (На моем персональном компьютере, Intel Core i7).
На компьютере, который я использую сейчас (Intel Core 2 Duo), результаты имеют больше смысла, чем предыдущие (вероятно, потому, что оптимизированный код не был проверен в VS): 460 ~ тиков для размещения стека и около 380 тиков для размещения кучи.
Но это все еще не имеет смысла. Почему это так? Я полагаю, что CLR замечает, что мы не используем массив, так что, возможно, он даже не выделяет его?