proc 内部 const 与外部 const 之间的区别
Difference between a const inside a proc vs outside
这可能是一个非常愚蠢的问题,但除了可见性之外,const
内部和 proc
外部之间是否有任何真正的区别?
const foo = "FOO"
proc test() =
const bar = "BAR"
echo foo & bar
test()
就像在内部一样,每次调用 proc
时,堆栈是否会针对 const
增长和收缩,或者因为它是一个 const
是否只是保存在静态内存中申请期间的位置?
我特别询问有关 Nim 的问题,但也欢迎使用其他语言对 differences/similarities 进行思考。
如果您查看生成的 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
声明。
这可能是一个非常愚蠢的问题,但除了可见性之外,const
内部和 proc
外部之间是否有任何真正的区别?
const foo = "FOO"
proc test() =
const bar = "BAR"
echo foo & bar
test()
就像在内部一样,每次调用 proc
时,堆栈是否会针对 const
增长和收缩,或者因为它是一个 const
是否只是保存在静态内存中申请期间的位置?
我特别询问有关 Nim 的问题,但也欢迎使用其他语言对 differences/similarities 进行思考。
如果您查看生成的 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
声明。