我所说的意思可以通过以下示例来解释:
auto p = std::make_shared<int>();
在int可变缺省初始化(因此具有垃圾值)或值初始化(从而具有零的值)?我已经在GCC 5.2和clang 3.6上进行了测试,前者进行了值初始化,后者进行了默认初始化.我想知道标准对此有何看法?在我看来,现代C++肯定应该在这种情况下执行值初始化.
这个问题与我的另一篇文章有关:为什么allocate_shared和make_shared这么慢
在这里,我可以更清楚地描述这个问题.
考虑以下代码:
struct A {
char data_[0x10000];
};
class C {
public:
C() : a_() { }
A a_;
};
int main() {
C c;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现代码中C() : a_(),编译器使用A memset(addr,0,0x10000)作为构造函数.如果类型A有一个空构造函数,则asm代码是正确的.
为了更清楚地描述问题,我写了一些测试代码:
#include <stdlib.h>
struct A {
//A() {}
char data_[0x10000];
void dummy() { // avoid optimize erase by compiler
data_[rand() % sizeof(data_)] = 1;
}
int dummy2() { // avoid optimize erase by compiler
return data_[0];
}
};
class B {
public:
template<class …Run Code Online (Sandbox Code Playgroud) 我无法理解 gcc 4.8.1 或 Visual Studio 2015 在默认初始化与值初始化方面的行为。
我试图自己理解这些之间的差异并可能遇到编译器错误并没有帮助?
我的问题是:有人可以解释这种行为吗?最好告诉我应该发生什么。
我有两个班级:
class Foo{
int _bar;
public:
void printBar(){ cout << _bar << endl; }
};
class bar{
int ent;
public:
int getEnt(){return ent;}
};
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码进行测试:
int main()
{
Foo foo;
foo.printBar();
Foo().printBar();
bar b;
cout << b.getEnt() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在 gcc 和 Visual Studio 上,我得到:
134514795
0
0
现在,如果我将测试代码更改为:
int main()
{
Foo foo;
foo.printBar();
bar b;
cout << b.getEnt() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc …