Разница между const внутри proc и снаружи

Вероятно, это действительно глупый вопрос, но кроме наглядности есть ли реальная разница между const внутри proc против снаружи?

const foo = "FOO"

proc test() =
  const bar = "BAR"
  echo foo & bar

test()

Например, когда внутри, стек растет и сжимается для этого const каждый раз proc вызывается, или потому что это const это просто хранится в статической памяти в течение всего времени работы приложения?

Я спрашиваю конкретно о Ним, но приветствуются размышления о различиях / сходствах в других языках.

1 ответ

Решение

Если вы посмотрите на сгенерированный C-код, вы увидите следующую строку:

STRING_LITERAL(TMP139, "FOOBAR", 6);

Что это говорит нам foo & bar был оценен во время компиляции.

nimbase.h имеет это:

#define STRING_LITERAL(name, str, length) \
  static const struct {                   \
    TGenericSeq Sup;                      \
    NIM_CHAR data[(length) + 1];          \
  } name = {{length, length}, str}

const в Nim гораздо больше, чем в статической памяти. Но похоже, что в этом случае мы получаем строку "FOOBAR" в статической ячейке памяти. Однако, если мы заменим эти строки числами, например, 1 а также 3сгенерированный код просто имеет 4 буквально без всякого хранения.

Теперь по актуальному вопросу. Единственное отличие здесь - это область видимости констант.

Если это не было упрощено таким образом (например, если вы написали echo foo\\echo bar), мы можем снова просмотреть сгенерированный код и увидеть два идентичных (кроме содержимого) STRING_LITERAL деклараций.

Другие вопросы по тегам