Как делает.NET IL .maxstack направляющая работа?

Если все, что Вы хотите, будет простым циклом подсчета, то

for (i=0; i<100; i++) dostuff();

будет прекрасен, и компилятор может оптимизировать его.

при использовании функции в продолжать части для оператора, как

for (i=0; i<strlen(s); i++) dostuff();

тогда функция будет оценена каждый раз, когда и это обычно - не хорошая идея, поскольку функциональные издержки замедлят процесс. Иногда это может замедлить Ваш процесс на грани неудобства использования.

, Если возвращаемое значение функции не изменится во время повторения, извлеките его из цикла:

slen = strlen(s);
for (i=0; i<slen; i++) dostuff();

, Но существуют времена, когда функция будет возвращать различные значения каждый вызов, и затем Вы не хотите извлеченный из цикла:

for (isread(fd, &buffer, ISFIRST);
     isstat(fd) >= 0;
     isread(fd, &buffer, ISNEXT)
{
  dostuff(buffer);
}

и Вы хотите его, оценил каждый раз. (Который является немного изобретенным примером на основе работы, которую я делаю, но она показывает потенциал).

C дает Вам необработанную способность прокрутить Ваш цикл любым путем, Вы можете. Необходимо знать, как цикл, как предполагается, работает, и Вы оптимизируете его как лучше всего, Вы можете, в зависимости от своих потребностей.

, Что последний пример, возможно, был выражен как некоторое время цикл:

isread(fd, &buffer, ISFIRST);
while (isstat(fd) >= 0)
{
  dostuff(buffer);
  isread(fd, &buffer, ISNEXT);
}

, но это не столь аккуратно, и если я использую продолжение в цикле, тогда я должен назвать итерацию isread снова. Вставление всего этого для цикла делает его более опрятным, и гарантирует, что итерацию isread называют каждым циклом.

я пишу функции низшего уровня, таким образом, они могут использоваться в для циклов как это. Это объединяет все элементы цикла с условием продолжения, таким образом, можно понять его более легко.

24
задан Micha Wiedenmann 27 February 2018 в 11:57
поделиться

2 ответа

.maxstack является частью проверки IL. Обычно .maxstack сообщает JIT максимальный размер стека, который необходимо зарезервировать для метода. Например, x = y + (a - b) переводится в

(Pseudo IL:)

1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
      substract them and
      push the result on the stack
5. Pop the last two items from the stack,
      add them and
      push the result on the stack
6. Store the last item on the stack in x and
      pop the last item from the stack

Как вы можете видеть, в стеке одновременно находится не более 3 элементов. Если вы установите .maxstack равным 2 (или меньше) для этого метода, код не будет работать.

Кроме того, у вас не может быть чего-то подобного, так как для этого потребуется бесконечный размер стека:

1. Push x on the stack
2. Jump to step 1

Чтобы ответить на ваши вопросы:

  1. применимо ли это только к функции или ко всем функциям, для которых мы вызываем?

Только к функции

  1. , даже если это была только функция .maxstack объявляется, как узнать, что такое maxstack, если у вас есть ветвление? Вы идете и видите все «пути» и возвращаете максимально возможное значение?

Вы идете и видите все пути и возвращаете максимально возможное значение

  1. Что произойдет, если я установлю его на 16, а на самом деле есть 17 переменных?

Это не связано с количеством переменных, см. Лассе В. Карлсен ' s answer

  1. Будет ли слишком большой штраф, если я установлю его на 256?

Это не кажется хорошей идеей, но я не знаю.

Вы действительно должны рассчитывать .maxstack самостоятельно? System.Reflection.Emit вычисляет его для вас IIRC.

26
ответ дан 29 November 2019 в 00:01
поделиться

Это не имеет ничего общего с числом объявленных переменных, но вместо этого все, что связано с тем, сколько значений вам нужно поместить в стек в любой момент времени, чтобы для вычисления некоторого выражения.

Например, в следующем выражении я бы предположил, что в стек нужно поместить 2 значения:

x = y + z;

Это не связано с тем фактом, что присутствуют как минимум 3 переменные, x, y , и z, а также, возможно, другие.

К сожалению, я не знаю ответа на ваши другие вопросы, и я предполагаю, что экспериментирование было бы одним из способов найти ответы.

5
ответ дан 29 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: