相关疑难解决方法(0)

std :: make_shared是否执行值初始化(GCC和clang不同意)?

我所说的意思可以通过以下示例来解释:

auto p = std::make_shared<int>();

int可变缺省初始化(因此具有垃圾值)或值初始化(从而具有零的值)?我已经在GCC 5.2和clang 3.6上进行了测试,前者进行了值初始化,后者进行了默认初始化.我想知道标准对此有何看法?在我看来,现代C++肯定应该在这种情况下执行值初始化.

c++ initialization language-lawyer c++11

22
推荐指数
2
解决办法
871
查看次数

为什么c ++使用memset(addr,0,sizeof(T))来构造一个对象?标准版还是编译错误?

这个问题与我的另一篇文章有​​关:为什么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)

c++ constructor perfect-forwarding c++11

5
推荐指数
1
解决办法
626
查看次数

默认初始化与零初始化

我无法理解 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 …

c++ default initialization zero

3
推荐指数
2
解决办法
1975
查看次数