C++ 改变输出的变量

C++ 改变输出的变量,c++,smart-pointers,C++,Smart Pointers,因此,我只运行了一个快速示例,可以使用一些帮助来了解发生了什么 我使用注释的变量“RandomNumber”运行测试,结果是 Construct Invoke Destruct Construct Destruct Invoke 因此,我再次运行测试,但未注释变量“RandomNumber”,输出为 Construct Invoke Destruct Construct Destruct Invoke 我试了很多次,结果都是一样的,但我真的不明白为什么这个变量会改变测试仪的寿命 测试:

因此,我只运行了一个快速示例,可以使用一些帮助来了解发生了什么

我使用注释的变量“RandomNumber”运行测试,结果是

Construct
Invoke
Destruct
Construct
Destruct
Invoke
因此,我再次运行测试,但未注释变量“RandomNumber”,输出为

Construct
Invoke
Destruct
Construct
Destruct
Invoke
我试了很多次,结果都是一样的,但我真的不明白为什么这个变量会改变测试仪的寿命
测试:

struct Container 
{
    template<typename T>
    Container(T&& O) : Data((void*)std::addressof(O)) {}

private:
    void* Data;
    //std::weak_ptr<int> RandomNumber;
};

struct Tester
{
    Tester() { std::cout << "Construct" << std::endl; }
    ~Tester() { std::cout << "Destruct" << std::endl; }
};

void TestFunction1(const std::vector<Container>& Data)
{
    std::cout << "Invoke" << std::endl;
}

int main()
{
    TestFunction1({ Tester() });
    return 0;
}

struct容器
{
模板
容器(T&&O):数据((void*)std::addressof(O)){}
私人:
作废*数据;
//标准:弱随机数;
};
结构测试仪
{

Tester(){std::cout在Windows 10上多次运行代码后,我发现无论是否注释了
弱随机数
,它都会产生几乎相同的输出:

Construct
Invoke
Destruct

这意味着系统中的输出不同,因为其他联机编译器产生了与您相同的结果。最可能的原因是输出依赖于系统/编译器,并且编译器进行了不同的优化。

在多个配置上进行测试后,结果因系统和编译器而异。因此,很难预测结果会是什么。

既然两个顺序都是有效的,为什么这很重要?发生这种情况的原因是,您没有在任何地方使用数据,因此编译器可以随心所欲地进行编译(如果启用了一些优化功能),这可能会发生甚至可以一起省略构造。不同的编译器和不同的优化器将是不同的-所以你看到了这种行为,而我没有。所以我要么有不同的编译器,要么有不同的优化标志。预测编译器优化器将做什么是不可能的。。。