LINUX.ORG.RU

История изменений

Исправление proud_anon, (текущая версия) :

The list of saved calls is executed after the surrounding function returns.

когда читаю такой текст, подразумеваю, что стек вызова минусуется (очищается).

А, вот откуда ты это взял! Я всё думал, почему ты вообще решил, что тут хвостовой вызов должен оптимизироваться.

Да, с точки зрения синтаксиса языка вызов defer'нутых функций выполняется после исполнения return, при вылете из функции при панике или по достижении конца функции. Таков синтаксис языка в вакууме. Но какой машинный код должен получаться из кода на Go, в том числе, должна ли функция очищать стек перед defer'нутыми вызовами, и вообще должен ли у машины быть стек, который можно очищать, о том спецификация вообще ничего не говорит.

вот это я называю синтаксическим сахаром.

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

Исправление proud_anon, :

The list of saved calls is executed after the surrounding function returns.

когда читаю такой текст, подразумеваю, что стек вызова минусуется (очищается).

А, вот откуда ты это взял! Я всё думал, почему ты вообще решил, что тут хвостовой вызов должен оптимизироваться.

Да, с точки зрения синтаксиса языка вызов defer'нутых функций выполняется после исполнения return, при вылете из функции при панике или по достижении конца функции. Таков синтаксис языка в вакууме. Но какой машинный код должен получаться из кода на Go, в том числе, должна ли функция очищать стек перед defer'нутыми вызовами, и вообще должен ли у машины быть стек, который можно очищать, о том спецификация вообще ничего не говорит.

вот это я называю синтаксическим сахаром.

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

Исходная версия proud_anon, :

The list of saved calls is executed after the surrounding function returns.

когда читаю такой текст, подразумеваю, что стек вызова минусуется (очищается).

А, вот откуда ты это взял! Я всё думал, почему ты вообще решил, что тут хвостовой вызов должен оптимизироваться.

Да, с точки зрения синтаксиса языка вызов defer'нутых функций выполняется после исполнения return, при вылете из функции при панике или по достижении конца функции. Таков синтаксис языка в вакууме. Но какой машинный код должен получаться из кода на Go, в том числе, должна ли функция реально делать ret перед defer'нутыми вызовами, о том спецификация языка не говорит вообще ничего.