我使用的是Delphi XE2,我必须编写一个需要一些常量数组的函数。如果我在函数中声明它们,它们将在什么时候创建?函数每次运行时还是只运行一次?示例:
function Something; const Arr: array[0..100] of string = ('string1', 'string2'...); begin end;
fzsnzjdm1#
在进程的生命周期内,该数组将在进程的内存中占据一个固定的恒定区域。事实上,你可以很容易地看到这一点:
每次计时器触发时,您会发现Pointer(@Arr)具有相同的值,并且在内存中,您会找到您的常量数组。如果您使用内存面板将其更改(如将string1更改为orange1),更改将持续存在。
Pointer(@Arr)
string1
orange1
ukxgm1gy2#
就安德烈亚斯·雷布兰德的回答做进一步的阐述……如果您声明了一个局部常量,即使您多次声明相同的值,它也将保留在编译中。这些常量将是独立的。换句话说,如果你写道:
function Something; const Arr: array[0..100] of string = ('string1', 'string2'...); begin end; function Otherhing; const Values: array[0..100] of string = ('string1', 'string2'...); begin end;
在编译后的代码中,您将得到两组“字符串1”和“字符串2”。如果您(在文件或内存中)将一个函数中的一个“字符串1”更改为“orange1”,则另一个“字符串1”将保持不变。没有编译器优化来“统一”这些常量。除了浪费代码之外,如果您将同一常量声明了两次,如果您在一个地方更改了代码,而忘记了检查其他地方,那么它可能会变得一团糟。总之,如果您的程序中有多个地方要使用常量,请始终考虑将它们声明为全局的(或在单元的作用域中)而不是本地的。
2条答案
按热度按时间fzsnzjdm1#
在进程的生命周期内,该数组将在进程的内存中占据一个固定的恒定区域。
事实上,你可以很容易地看到这一点:
每次计时器触发时,您会发现
Pointer(@Arr)
具有相同的值,并且在内存中,您会找到您的常量数组。如果您使用内存面板将其更改(如将
string1
更改为orange1
),更改将持续存在。ukxgm1gy2#
就安德烈亚斯·雷布兰德的回答做进一步的阐述……
如果您声明了一个局部常量,即使您多次声明相同的值,它也将保留在编译中。这些常量将是独立的。换句话说,如果你写道:
在编译后的代码中,您将得到两组“字符串1”和“字符串2”。如果您(在文件或内存中)将一个函数中的一个“字符串1”更改为“orange1”,则另一个“字符串1”将保持不变。没有编译器优化来“统一”这些常量。
除了浪费代码之外,如果您将同一常量声明了两次,如果您在一个地方更改了代码,而忘记了检查其他地方,那么它可能会变得一团糟。
总之,如果您的程序中有多个地方要使用常量,请始终考虑将它们声明为全局的(或在单元的作用域中)而不是本地的。