为什么在C ++中,我们更喜欢静态初始化到动态初始化? 什么是重要的?如果静态初始化是如此高效,那么为什么新的语言如Java,C#使用动态初始化?
答案 0 :(得分:8)
我们没有。我们更喜欢自动初始化 - 即在堆栈上创建对象(与堆相对)。如果我们这样做,他们的生命周期就会为我们管理。这是C ++相对于Java的众多优势之一。至于为什么Java这样工作,你应该问设计师,但我猜它是为了简化垃圾收集(同时引入了很多其他问题)。
答案 1 :(得分:3)
任何人甚至注意到C ++的差异的主要原因是静态初始化不能依赖于其他全局变量的内容。因此它不会与初始化命令惨败相冲突。
所以,如果我将要使用全局变量,我可能更喜欢将它们静态初始化,然后以受控顺序填充值,而不是抓住订单的机会不在同一翻译单元中的对象的动态初始化。但实际上,“我们”(意思是我)在C ++中根本不喜欢全局变量,而当我们确实拥有它们时,“我们”更喜欢它们是函数范围的静态而不是全局范围的静态。所以这是一个非常温和的偏好,确实是某种方式被初始化,我们不想首先存在。
Java确实使用了静态初始化的类比:最终的静态整数甚至变成了编译常量。但是由于Java对象总是在堆上,并且具有用户定义的构造函数,因此无法使用类似于C ++的静态初始化的任何东西来初始化对象,这是由运行时在执行任何用户代码之前完成的。当您的语言根本无法使用其中一个选项时,性能不是考虑因素。每当在Java中将静态字段初始化为null
时,您可能会说这类似于C ++静态初始化。
答案 2 :(得分:2)
一般来说,我们既不喜欢静态也不喜欢动态init。确定哪一个是特定情况的首选取决于您的具体情况。
答案 3 :(得分:0)
谁说我们这样做?老实说,这是我第一次听到这样的事情。静态初始化在某些情况下更好,而动态在其他情况下更好。经验法则是:如果你在编译时知道有多大/多少然后使用静态(更容易,更快地输入,不需要使用智能指针/删除,没有内存泄漏)..否则你别无选择,只能使用动态的。