静态初始化与动态初始化 为什么在C++中,我们更喜欢静态初始化而不是动态初始化? 有什么大不了的?如果静态初始化性能如此之高,那么为什么像Java、C这样的新语言使用动态初始化?

静态初始化与动态初始化 为什么在C++中,我们更喜欢静态初始化而不是动态初始化? 有什么大不了的?如果静态初始化性能如此之高,那么为什么像Java、C这样的新语言使用动态初始化?,java,c++,Java,C++,一般来说,我们既不喜欢静态初始化,也不喜欢动态初始化。根据您的具体情况,确定哪一种更适合特定情况。我们不这样做。我们更喜欢自动初始化,即在堆栈上创建对象(与堆相反)。如果我们这样做,他们的生命将为我们管理。这是C++在java之上的许多优点之一。至于Java为什么会这样工作,你应该问问设计人员,但我猜这是为了简化垃圾收集(同时带来许多其他问题)。谁说我们会这样做?老实说,这是我第一次听到这样的话。。静态初始化在某些上下文中更好,而动态初始化在其他上下文中更好。经验法则是:如果在编译时知道有多大/

一般来说,我们既不喜欢静态初始化,也不喜欢动态初始化。根据您的具体情况,确定哪一种更适合特定情况。

我们不这样做。我们更喜欢自动初始化,即在堆栈上创建对象(与堆相反)。如果我们这样做,他们的生命将为我们管理。这是C++在java之上的许多优点之一。至于Java为什么会这样工作,你应该问问设计人员,但我猜这是为了简化垃圾收集(同时带来许多其他问题)。

谁说我们会这样做?老实说,这是我第一次听到这样的话。。静态初始化在某些上下文中更好,而动态初始化在其他上下文中更好。经验法则是:如果在编译时知道有多大/有多少,那么就使用静态(更容易、更快地键入,不需要使用智能指针/删除,没有内存泄漏)。。否则你别无选择,只能使用动态。

,任何人甚至注意到C++的差异的主要原因是静态初始化不能依赖其他全局内容。因此,它不会与初始化命令的失败相冲突

所以,如果我想要全局变量,我可能更喜欢静态初始化,然后以受控顺序填充值,而不是冒险按照不在同一转换单元中的对象的动态初始化顺序。但实际上,“我们”(意思是I)在C++中不喜欢全局,而当我们确实有它们时,“我们”更喜欢它们是函数范围静态而不是全局范围静态。因此,这是一个非常温和的偏好,事实上,我们不希望以这种方式初始化某些东西


Java确实在某些方面使用了静态初始化的类似物:最终的静态整数甚至被转换为编译常量。但是,由于Java中的对象总是在堆上,并且具有用户定义的构造函数,因此无法使用类似于C++静态初始化的任何东西初始化对象,这是在执行任何用户代码之前由运行时完成的。当这两个选项中的一个在您的语言中根本不可能实现时,性能不是一个考虑因素。每当在爪哇中静态字段初始化为<代码> null <代码>时,您可能会说这类似于C++静态初始化。对于关键堆栈和堆区分,

+ 1。我已经稍微调整了你的答案,但如果你不喜欢,请回复。JVM的较新版本可以通过-server-XX:+doescapealysis选项允许分配到堆栈而不是堆。当可以进行这种优化时,这可以在性能上提供一些重大改进。希望在Java7中默认启用此功能