2

这可能是一个非常愚蠢的问题,但除了可见性之外,const内部proc与外部之间是否有任何真正的区别?

const foo = "FOO"

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

test()

就像在内部一样,const每次proc调用时堆栈都会增长和缩小,还是因为它const只是在应用程序期间保存在静态内存位置?

我专门询问 Nim,但也欢迎对其他语言的差异/相似之处进行反思。

4

1 回答 1

4

如果您查看生成的 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"在静态内存位置获取了字符串。但是,如果我们用数字替换这些字符串,例如1and 3,生成的代码只有一个4没有任何存储空间的文字。

现在,对于实际的问题。这里唯一的区别是可以看到常量的范围。

如果没有以这种方式简化(例如,如果您编写了echo foo\\echo bar),我们可以再次查阅生成的代码并查看两个相同的(内容除外)STRING_LITERAL声明。

于 2015-04-01T14:37:19.913 回答