mind3x 最近的时间轴更新
mind3x

mind3x

V2EX 第 67506 号会员,加入于 2014-07-09 23:44:18 +08:00
今日活跃度排名 17825
我又来每天一种不同的语言写 Advent of Code 2022 了
  •  1   
    程序员  •  mind3x  •  3 天前  •  最后回复来自 airplayxcom
    8
    每天一种不同的语言,挑战 Advent of Code 2021
    程序员  •  mind3x  •  351 天前  •  最后回复来自 mind3x
    16
    介绍一个 Rust 版的高性能 lock free concurrent hashmap
    分享创造  •  mind3x  •  2020-11-30 00:22:17 AM  •  最后回复来自 mind3x
    5
    迅极云是不是跑路了?
    全球工单系统  •  mind3x  •  2017-09-20 23:14:23 PM  •  最后回复来自 tianwm
    2
    目测用 GRE 直接导致 IP 被 block
    宽带症候群  •  mind3x  •  2018-02-01 13:26:39 PM  •  最后回复来自 redsonic
    14
    连公司用的 CN2 都被中国电不信 QJ 了
    宽带症候群  •  mind3x  •  2016-12-10 08:11:21 AM  •  最后回复来自 akw2312
    8
    Nexus 6P 更新 7.1beta
    Android  •  mind3x  •  2016-10-20 14:37:48 PM  •  最后回复来自 mind3x
    2
    集思广益: Zite 的替代选择?
    问与答  •  mind3x  •  2015-11-25 18:12:51 PM  •  最后回复来自 mind3x
    2
    这两天 CN2 连 QuadraNet 有点不正常啊
    VPS  •  mind3x  •  2015-11-04 14:50:24 PM
    你们以为 CN2 就没事了?
  •  2   
    宽带症候群  •  mind3x  •  2015-08-15 12:30:14 PM  •  最后回复来自 marsteel
    18
    mind3x 最近回复了
    3 天前
    回复了 jsjcjsjc 创建的主题 问与答 有啥无脑把 docker 应用搬家的办法吗?
    多一句嘴,不喜请随意忽略。docker image 本身应该是无状态的,打包整个 container 不是正确做法。

    正确做法是所有可变的数据和配置应该独立于 image 之外,比如放在 host 上,作为 volume 映射到 container 里。迁移时只把 volume 拷走就行。
    @learningman Advent of Code 本身不限语言,手算都可以。怎么解决是个人选择。
    @mascteen
    @netabare
    没什么成就,接触平时用不到的语言,杀时间。
    @44670 这翻译腔,我怀疑你是 ChatGPT >_<
    15 天前
    回复了 bthulu 创建的主题 .NET List<Apple>不能赋值给 List<object>吗?
    C#居然协变逆变还是针对具体容器类型的……
    16 天前
    回复了 Tokyo101 创建的主题 Android 三星 S22, Pixel 7 Pro 选哪个?
    @chenyx9 反正 Pixel 1 到 6 都不能开微信支付宝的指纹
    19 天前
    回复了 v2e0xAdmin2 创建的主题 Android 刷 Pixel Experience 还是 买 pixel
    @v2e0xAdmin2 现在 Pixel 用国内 app 也没啥问题,虽然我一般把国内 app 都专门另装在小米上。

    但我坚持用了 Nexus 和 Pixel 系列这么多年,也觉得越来越没意思了。
    看来国内真是人均手写 raft 的水平啊
    @geelaw 多谢指出,确实不写 C++好多年了。
    写了 20 多年 Java ,也写过 JVM ,我来尝试解释一下。

    首先 Java 这个行为和 C#是一样的:在子类尚未完成初始化时,父类的构造函数就已经能调用在子类中重载的函数。这意味着不注意的话很容易跑出 NPE 和别的毛病来。这个问题在 stackoverflow 上也经常有人问。

    要理解这个行为,可以看一下 JVM spec 里对 invokevirtual 这个字节码的解释: https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-6.html#jvms-6.5.invokevirtual

    注:invokevirtual 是 JVM bytecode 调用在 class 中定义的 virtual 函数时所使用的指令。

    简单的说,调用虚方法时,查找的是当前实例(this)的类的方法表,也就是你的 Child 的方法表。

    这里 Java 和 C++的区别是,C++的虚函数表(vtable)的建立,在逻辑上是动态的,相当于每一层实例构造完以后,更新一次 vtable 。当然实际上 C++编译器不会这么没效率,就把构造函数里调用的函数当作非虚函数在编译期直接 resolve 完事。

    而 Java 的类的方法表就那么一张,每个类在加载验证 link 完成以后,方法表就在那里不动了。而基类构造函数的调用是在初始化实例时动态发生的,调虚方法时查的表也是 Child 的表,自然会调用到 Child 中重载的函数,即使此时 Child 的数据成员并未初始化。

    这样做在逻辑上确实有难以理解的地方:Child 整个实例都还没处于一个合法的状态,其方法就被调用了。

    但是,C++这种做法也有其局限性:确实有场景是需要基类能在构造函数里调用子类重载的虚函数,只要子类的实现不依赖子类的数据成员即可。打个比方:

    class Bike {
    Bike () {
    frontWheel = makeWheel();
    rearWheel = makeWheel();
    }
    Wheel makeWheel();
    }

    class TitaniumBike {
    Wheel makeWheel() {
    return new TitaniumAllyWheel();
    };
    }

    这样子类就可以正确产生一辆拥有钛合金狗眼(划掉)轮子的自行车。这里不讨论此种设计模式的优劣,只是举个例子。我本人反正是不会这么写。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1451 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 187ms · UTC 23:36 · PVG 07:36 · LAX 15:36 · JFK 18:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.