为什么默认参数在发布中没有完全初始化?(调试与发布)

Why aren't default parameters fully initialized in Release? (Debug vs. Release)

本文关键字:调试 初始化 参数 默认 布中没 为什么      更新时间:2023-10-16

只是为了给我一些背景。我是一位经验丰富的 C# 开发人员,正在切换到 C++ 项目。我在职业生涯早期做了多年的 c++,但有点生疏......话虽如此。这是我能想出的最简单的例子来展示我的问题:

#include <vector>
#include <iostream>
using namespace std;
struct Inner
{
public:
    float A;
    unsigned short B;    
    Inner()
        :A(0.0F), B(0)
    {
    }
    Inner(const float& valA, const unsigned short& valB)
        : A(valA), B(valB){}        
};
class Outer
{
private:
    const vector<Inner> CollectionOfInner;
public:
    Outer(const vector<Inner> initialVal = { Inner(1.0F, 4), Inner(9.0F, 4), Inner(81.0F, 18) })
        : CollectionOfInner(initialVal)
    {
        cout << "Values" << 'n';
        for (int i = 0; i < 3; i++)
        {
            cout << "A: " << CollectionOfInner[i].A << " B: " << CollectionOfInner[i].B << 'n';
        }
    }    
};
int main()
{
    Outer test;
}

我的程序只是依靠上面显示的默认参数创建 Outer 的堆栈实例。在调试中,一切都按预期工作,给出以下输出:

Values
A: 1 B: 4
A: 9 B: 4
A: 81 B: 18
Press any key to continue . . .

但是,在发布配置中,只有三个内部实例中的第一个正确初始化,输出如下:

Values
A: 1 B: 4
A: 4.59009e-039 B: 4138
A: 2.64788e-038 B: 52345
Press any key to continue . . .

我敢肯定这与发布中打开的一些优化有关......但对于我的生活,我无法想象你为什么会想要这种行为......起初,我以为在我的大型项目中只是在进行某种内存破坏,但是一旦我用这样一个简单的项目确认了"错误",我就知道发生了更基本的事情。注意:如果我向外部构造函数提供预先创建的向量,一切都很好。仅当依赖默认构造函数时,才会出现问题。有什么想法吗?此外,作为参考,这是在 Visual Studio 2013 中使用标准C++控制台应用程序项目模板完成的。

共识似乎是Visual Studio 2013中的一个错误。自己回答这个问题来解决问题。谢谢大家!