Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每个对象是否为常量分配内存?_C#_Vb.net_Memory_Memory Management - Fatal编程技术网

C# 每个对象是否为常量分配内存?

C# 每个对象是否为常量分配内存?,c#,vb.net,memory,memory-management,C#,Vb.net,Memory,Memory Management,在我的代码设计中,我包含了很多常量。创建新对象时,是为该对象的常量分配内存,还是像静态变量一样永久存储在单个实例中?在内存存储方面,静态项最终会出现在哪里 换句话说,如果我定义100个对象,是否会有100个相同常量值的副本 如果它们是在静态内存中定义的(无论在何处),并且我认为它们是,那么访问它们是否需要计算机切换内存页?不断访问常量而不是变量是否会影响性能 谢谢 Ares常量在运行时没有存储位置。对常量标识符的所有访问都会导致该常量的文本值在编译代码时替换标识符。根据: 事实上,当编译器在C#

在我的代码设计中,我包含了很多常量。创建新对象时,是为该对象的常量分配内存,还是像静态变量一样永久存储在单个实例中?在内存存储方面,静态项最终会出现在哪里

换句话说,如果我定义100个对象,是否会有100个相同常量值的副本

如果它们是在静态内存中定义的(无论在何处),并且我认为它们是,那么访问它们是否需要计算机切换内存页?不断访问常量而不是变量是否会影响性能

谢谢


Ares

常量在运行时没有存储位置。对常量标识符的所有访问都会导致该常量的文本值在编译代码时替换标识符。

根据:

事实上,当编译器在C#源代码中遇到常量标识符时,它会将文本值直接替换为它生成的中间语言(IL)代码

因此,使用一个常数,如下所示:

const int myConst = 5;
int x = myConst;
字面意思(请原谅双关语)与以下代码没有区别:

int x = 5;

编译器将以任何方式生成相同的输出。当程序集运行时,该值存储在堆栈(执行方法的本地内存)中。无需查找、内存页切换、内存堆访问或任何其他操作。

否,常量字符串文字将具有对内部字符串对象的对象引用。这被称为字符串插入,由CLR应用,以提高性能并减少保存所有具有相同字符序列的文本所需的内存空间。@Mert但常量标识符不是保存这些数据的内容。语义与在整个代码中简单地嵌入实际字符串文本是相同的。是的,如果启用了interning,这会导致字符串位于intern池中,而对代码中这些文本的所有访问都使用对池中该字符串的硬编码引用。从
const
语义的角度来看,这一切都是不相关的。内存中没有一个表示该常量标识的存储。如果您考虑的问题被解释为错误,因为如果所有字符串都用LDSTR命令来推送,那么您将有一个大的性能命中率和内存消耗。假设一个程序访问常量字符串数百万次,如果我们每次都从元数据中加载文本,这将是一个问题,对吗?@Mert,如果你禁用字符串内部处理,这正是发生的情况。你指的是一个与常量概念分离的特性。数百万次访问常量字符串与简单地在程序中嵌入相同的字符串文字数百万次没有区别。要回答“换句话说,如果我定义100个对象,是否会有100个相同常量值的副本?”的问题,如果启用interning(默认情况下),则将引用一个对象。如果没有,那么性能就会受到影响,代码也会变得更大。我认为这是对问题的更好解释。