默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
are POD given special treatment when default initializing (c++14)?
为什么以下代码生成 0 作为输出?在我的理解中,它是默认初始化(不是值初始化),因此值应该是随机的。
#include <stdio.h>
#include<iostream>
#include<memory>
using namespace std;
struct A
{
int i;
int j;
};
int main()
{
A a;
cout << " i is " << a.i << endl;
return 0;
}
从 CPP 首选项:
默认初始化的效果如下:
如果 T 是非 POD(直到 C++11)类类型,则考虑构造函数并针对空参数列表进行重载解析。调用所选构造函数(默认构造函数之一)以提供新对象的初始值;
如果 T 是数组类型,则数组的每个元素都是默认初始化的;
否则,不执行任何操作:具有自动存储持续时间的对象(及其子对象)初始化为不确定值。
你得到什么值a.i
没有定义,你应该期望得到任何值。
在系统上点胶,使用的标准库,编译器,编译器标志,...内存的某些部分(例如堆栈)可能会用0
初始化,但不能保证这一点。
对于gcc
也是如此,在您的简单示例中,您可能总是会得到0
,但是如果您关闭优化-O0
并编译以下代码:
#include <iostream>
struct A
{
int i;
int j;
};
int foo() {
A a;
const int b = a.i;
a.i = 123;
return b;
}
int main() {
const int n1 = foo();
const int n2 = foo();
std::cout << n1 << " " << n2 << std::endl;
return 0;
}
然后(取决于操作系统,标准库,cpu...)您将有以下输出:
0 123
在这两种情况下,a.i
都是未初始化的,对于第一次调用,a.i
持有一些"随机">号码,对于第二次调用,a
可能在同一位置创建,并且截至此,这部分内存可能仍然保存123
。原因是A
是在堆栈上创建的,随后对 offfoo
的调用很可能会导致a
位于堆栈上的同一内存地址上。
基于讨论,实验。这是未定义的行为。POD 在默认初始化中没有特殊处理。
clang,MSVC总是给出随机值,但gcc总是给出0。毕竟,未定义就是未定义。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- 枚举环境变量的惯用C++14/C++17方法
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 如何在 C++14 中处理此特定代码
- G++ (C++14) 链接器错误,用于处理 C++03 代码
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 处理c++ 11/14中的儒略历日
- 双精度/打印在c++中不能处理14位数字
- c++ 1y/14: constexpr函数中的错误处理