gpt4 book ai didi

c# - 编译器可以在变量实际启动之前为变量赋值吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:35 26 4
gpt4 key购买 nike

我刚读过 http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html?page=5它说:

the compiler is free to assign a value to the singleton member variable before the singleton's constructor is called

请问是不是打错了。他们真的真的想说:JVM 的实现是免费的而不是编译器是免费的

我的第二个问题是 C#/VB 也有这个问题吗? (其中“编译器”可以自由地为变量赋值,甚至在变量完全启动之前/甚至在变量类的构造函数完全运行之前。

最佳答案

在Java中,为对象分配内存和调用构造函数是两个独立的操作。例如,类似

Object o = new Object();

编译成这些字节码:

0:  new #2; //class java/lang/Object
3: dup
4: invokespecial #1; //Method java/lang/Object."<init>":()V
7: astore_1

在指令 0 之后,对已分配但未构造的对象的引用位于堆栈上。直到偏移量 4 才调用构造函数。绝对没有什么可以阻止编译器将该引用分配给它想要的任何变量,包括静态成员。因此,这篇文章是正确的。

我不知道 CLR 字节码,但我想它与 JVM 的指令集相当接近,而且我猜想该运行时也会存在与线程相关的相同类型的警告。它当然适用于 native 代码编译器。

关于c# - 编译器可以在变量实际启动之前为变量赋值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944601/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com