这可能是一个非常愚蠢的问题,但除了可见性之外,const
内部proc
与外部之间是否有任何真正的区别?
const foo = "FOO"
proc test() =
const bar = "BAR"
echo foo & bar
test()
就像在内部一样,const
每次proc
调用时堆栈都会增长和缩小,还是因为它const
只是在应用程序期间保存在静态内存位置?
我专门询问 Nim,但也欢迎对其他语言的差异/相似之处进行反思。
如果您查看生成的 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
and 3
,生成的代码只有一个4
没有任何存储空间的文字。
现在,对于实际的问题。这里唯一的区别是可以看到常量的范围。
如果没有以这种方式简化(例如,如果您编写了echo foo\\echo bar
),我们可以再次查阅生成的代码并查看两个相同的(内容除外)STRING_LITERAL
声明。