размер переменной после автоматической инициализации


#include <iostream>
#include <math.h>

using namespace std;

int main() {
    int    i{100};
    float  f{3.14};
    double d{3.14159};
    cout<<"size of int is: "   <<sizeof(i)<<endl;
    cout<<"size of float is: " <<sizeof(f)<<endl;
    cout<<"size of double is: "<<sizeof(d)<<endl<<endl;;

    auto x = sin(3.14159);
    cout<<"size of auto that is double is: "<<sizeof(x)<<endl<<endl;

    auto y{sin(3.14159)};
    cout<<"size of auto that is double is: "<<sizeof(y)<<endl;
    return 0;
}

Вывод:

Размер int: 4

Размер поплавка: 4

Размер двойника: 8

Размер автомобиля, который является двойным, равен: 8

Размер автомобиля, который является двойным, равен: 16

Почему sizeof(y) 16?

1 5

1 ответ:

Используя "typeid" с gcc 4.8.4 следующим образом:

#include <iostream>
#include <math.h>
#include <typeinfo>

using namespace std;

int main() {
    int    i{100};
    float  f{3.14};
    double d{3.14159};
    cout<<"size of int is: "   <<sizeof(i)<<endl;
    cout<<"size of float is: " <<sizeof(f)<<endl;
    cout<<"size of double is: "<<sizeof(d)<<endl<<endl;;

    auto x = sin(3.14159);
    cout<<"size of auto that is double is: "<<sizeof(x)<<endl<<endl;

    auto y{sin(3.14159)};
    cout<<"size of auto that is double is: "<<sizeof(y)<<endl;

    cout << typeid(y).name() << endl;

    return 0;
}

Я получаю следующий результат:

$ ./main 
size of int is: 4
size of float is: 4
size of double is: 8

size of auto that is double is: 8

size of auto that is double is: 16
St16initializer_listIdE

Я думаю ,что "auto y" на самом деле не присваивается дважды, но один из них: http://en.cppreference.com/w/cpp/utility/initializer_list

В нем говорится: "объект типа std:: initializer_list-это легкий прокси-объект, который обеспечивает доступ к массиву объектов типа const T."

Таким образом, скорее всего, дополнительное пространство используется для хранения указателя и размера вектора, или что-то вроде этого.