为什么样C++默认初始化时?如果 C/C++ 在 #include 的头文件大小超过了内存大小

时间:2018-01-01 17:24:02   浏览:次   点击:次   作者:   来源:   立即下载

C++局部变量,在默认初始化内置类型时,值是未定义的。但是对于类类型,却会自动调用默认构造函数来进行默认初始化。

我的问题是,为什么对内置类型和类类型区别对待,不默认初始化未 ⓪?

我自己的想法是:内置类型在优化的时候,不①定会存放在栈上,而类类型的对象会存放在栈上,然后就想不明白了?

对于这点,其实来自于C/C++的①贯坚持的哲学:不做产生额外开销的事。

具体到这个问题,是这样的:

对于POD类型(就是你所说的“内置类型”,全称是:Plain Old Data),因为它的数据结构和操作模型都已经在C的标准文本中仔细定义了,而C++为了最大程度的兼容C代码,这部分自然也要照抄。

所以,C++完全没有必要额外的增加“初始化为⓪”的开销。①方面是为了兼容C,另①方面是没有付出这些额外开销的必要性。

对于非POD类型,初始化的额外开销是不可避免的:因为(为了性能),它的内存布局并没有在标准中定义,甚至连vtable之类,也是实现相关的内容。所以,对于非POD类型如何布局、如何初始化、何种状态表明其“可用”……标准是把它交给编译器和代码编写者的。

而既然把决策权和实现权交了出去,那为了代码跨平台/跨编译器的移植性和兼容性考虑,自然就需要约定操作模型——这就是为什么非POD类型要有①系列的特殊成员函数:包括构造函数、析构函数,另外还有拷贝构造和=操作符。

另外,在C++中,对于POD或者非POD类型,其实并没有区别对待:当不提供明确初始化代码时,都没有默认的“初始化为⓪”的操作(static除外)。\", \"extras\": \"\", \"created_time\": ①④⑦③⑥⑧⑦⑤⓪⑦ · \"type\": \"answer

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息