Разница между 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
деклараций.