原始数据类型的初始值

时间:2011-03-04 12:17:47

标签: c++

#include <iostream>

class MyClass
{
public:
    MyClass() :
        mFirst()
    {
    }

    int mFirst;
    int mSecond;
};


int main()
{
    MyClass mc;
    std::cout << "mc.mFirst: " << mc.mFirst << std::endl;
    std::cout << "mc.mSecond: " << mc.mSecond << std::endl;

    int a;
    std::cout << "a: " << a << std::endl;
    return 0;
}

该计划的预期产出是多少?

我认为只有MyClass.mFirst会被初始化为零。但是,即使启用了优化,GCC也会将它们全部初始化为零:

$ g++ -o test -O3 main.cpp
$ ./test
mc.mFirst: 0
mc.mSecond: 0
a: 0

我想知道:

  1. 如何根据C ++标准初始化每个值?
  2. 为什么GCC将它们全部初始化为零?
  3. 更新

    根据Erik的说法,值为零,因为我的堆栈恰好包含零。我尝试使用这个结构强制堆栈为非零:

    int main()
    {
        // Fill the stack with non-zeroes
        {
            int a[100];
            memset(a, !0, sizeof(a));
        }
        MyClass mc;
        std::cout << "mc.mFirst: " << mc.mFirst << std::endl;
        std::cout << "mc.mSecond: " << mc.mSecond << std::endl;
    
        int a;
        std::cout << "a: " << a << std::endl;
        return 0;
    }
    

    但是,输出保持不变:

    mc.mFirst: 0
    mc.mSecond: 0
    a: 0
    

    任何人都可以解释原因吗?

    更新2

    好的我明白了。 GCC可能正在优化掉未使用的变量。

    此应用程序显示预期的行为:

    #include <iostream>
    
    struct MyClass
    {
        MyClass() : mFirst() { }
    
        MyClass(int inFirst, int inSecond) : mFirst(inFirst), mSecond(inSecond) { }
    
        int mFirst;
        int mSecond;
    };
    
    
    int main()
    {
        // Fill the stack with non-zeroes
        // Use volatile to prevent GCC optimizations.
        {
            volatile MyClass mc(1, 2);
            volatile int a = 3;
        }
    
        {
            volatile MyClass mc;
            volatile int a;
    
            std::cout << "mc.mFirst: " << mc.mFirst << std::endl;
            std::cout << "mc.mSecond: " << mc.mSecond << std::endl;
            std::cout << "a: " << a << std::endl;
        }
        return 0;
    }
    

    输出:

    $ g++ -o test main.cpp
    $ ./test 
    mc.mFirst: 0
    mc.mSecond: 2
    a: 3
    

2 个答案:

答案 0 :(得分:4)

他们是(编辑:使用“他们”,我指的是mSecond,而未明确初始化的)未初始化。您的堆栈恰好包含0,因此这是您获得的值。

8.5 / 9:

  

如果没有为a指定初始值设定项   对象,对象是(可能是   cv-qualified)非POD类类型(或   对象应该是   默认初始化;如果对象是   const限定类型,   基础类型应具有   用户声明的默认构造函数。   否则,如果没有初始化器   为非静态对象指定的   对象及其子对象(如果有)   有一个不确定的首字母   值;如果对象或其中任何一个   子对象具有const限定条件   类型,该程序是不正确的。

答案 1 :(得分:1)

它们被归类为“未定义”,表示编译器决定的内容或创建时该位置的内存中的任何内容。基本上,让他们没有初始化是让它有机会,你应该初始化它们。没有初始化我可以想到的结构成员的唯一原因是,如果你有一个非常非常大的数组,并且不想多次调用构造函数。