初始数据成员值

Initial data member values

本文关键字:数据成员      更新时间:2023-10-16

我非常惊讶地看到,在VS2013附带的Visual c++ 版本中,新创建类的数据成员似乎根据其类型自动初始化为0null。这是新的,非常有用!——以我的经验来看。我以前只在编写严肃的应用程序时使用过 vc++版本4,早在20世纪90年代中期,初始值是明确地将声明为未定义/随机。

这可能是使用调试库的一些有用属性,或者有可能一直依赖于null初始化吗?

按要求,一些示例代码-恐怕没有什么很令人兴奋的:

class CData
{
public:
    CData();
    CData(const CData &copy);
    ~Data();
    const CData& operator=(const CData &copy);
    //Accessors/Mutators follow...

private:
    bool Initialize_Data();
    //Just giving a couple of examples of data member sets.
    char *input_script_name;
    int size_input_script_name;
    int size_input_script_name_buffer;
    char *interpreter_name;
    int size_interpreter_name;
    int size_interpreter_name_buffer;
};
CData::CData()
{
    Initialize_Data();
}
CData::~CData()
{
    //Code to store relevent data in registry
    //and then free dynamically allocated memory follows...
}
bool CData::Initialize_Data()
{
    //Code to retrieve data from registry stored at end of last run follows
    //along with routines to check bounds.
    //
    //At this point, without executing any further a breakpoint is triggered
    //and on inspecting data members in a Watch on 'this' I find them
    //to be already initialized to either 0 or null respectively.
}
...
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    //Application entry point;
   CData application_data;  //and away it goes!
   //Usual name mutex to prevent multiple instances and message loop follow...
}

正如我所说的非常基本,我没有说明所有的代码。然而,在到达'Initialize_Data'中的断点时——即在创建类和执行任何其他操作之前——所有数据成员在Watch中显示为0或null。这是相当令人惊讶的!

这只是一个巧合。你可能会注意到,在对象初始化之前,有东西清除了大量内存,然后你的对象被放在零初始化的内存中。不能保证这种情况会继续存在,也不能在其他平台/编译器上依赖它。在调试模式下,visualc++实际上会尝试清除为非零位模式,例如。

如果想要零初始化,可以使用c++ 11的非静态成员初始化器,如下所示:

char *input_script_name = nullptr;
int size_input_script_name = 0;
int size_input_script_name_buffer = 0;
char *interpreter_name = nullptr;
int size_interpreter_name = 0;
int size_interpreter_name_buffer = 0;

我不确定当前的编译器是否将其优化为memset,如果一切都设置为0,但如果您可以访问c++ 11编译器,这是一种方法。

更新

刚刚检查了Clang 3.4,如果一切都设置为0,它会发出memset。GCC使用寄存器进行初始化,但我怀疑这是因为我的小测试用例只有~10个成员变量。