POD предоставляется специальная обработка при инициализации по умолчанию (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;
}

из cppreference:

Эффекты инициализации по умолчанию:

если T является типом класса не POD (до C ++ 11), конструкторы рассматриваются и подвергаются разрешению перегрузки для пустого списка аргументов. Выбранный конструктор (который является одним из конструкторов по умолчанию) вызывается для предоставления начального значения для нового объекта;

если T является типом массива, каждый элемент массива инициализируется по умолчанию;

в противном случае ничего не делается: объекты с автоматической продолжительностью хранения (и их подобъекты) инициализируются неопределенными значениями.

4 голоса | спросил code707 7 Maypm18 2018, 14:46:25

2 ответа


0
Какое значение вы получите для ---- +: = 0 =: + ---- не определено, вы должны ожидать получить любое значение.В зависимости от системы, используемой библиотеки std, компилятора, флагов компилятора ... некоторые части памяти (например, стек) могут быть инициализированы с помощью ---- +: = 1 =: + ---- ,но нет никаких гарантий для этого.Это также верно для ---- +: = 2 =: + ---- , в вашем простом примере вы всегда можете получить ---- +: = 3 =: + ---- , но если вы выключитеоптимизации ---- +: = 4 =: + ---- и скомпилируйте следующий код:Затем (в зависимости от библиотеки os, std, cpu ...) вы получите следующий вывод:В обоих случаях ---- +: = 7 =: + ---- неинициализирован, для первого вызова ---- +: = 8 =: + ---- содержит некоторое «случайное» число, дляВторой вызов ---- +: = 9 =: + ---- может быть создан в том же месте, и на этом этапе эта часть памяти может все еще содержать ---- +: = 10 =: + ----Причина в том, что ---- +: = 11 =: + ---- создается в стеке, и последующие вызовы off ---- +: = 12 =: + ----Вероятно, причина в том, что ---- +: = 13 =: + ---- находится по тому же адресу памяти в стеке.
ответил t.niese 7 Maypm18 2018, 20:52:39
0
На основании обсуждения, эксперимента.Это неопределенное поведение.POD не имеет специальной обработки при инициализации по умолчанию.clang, MSVC всегда давал случайное значение, но gcc всегда давал 0. В конце концов, undefined не определен.
ответил code707 7 Maypm18 2018, 15:05:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132