【总结】张雪峰大一的时候应该教的东西

2020-06-28  本文已影响0人  游学者夏纳

添加部分注释 2020/6/29 by xana


回答下面输出的结果:

// C++ define
struct Foo
{
    Foo(int32_t a){ i32 = a; }
    int32_t i32;
    int16_t i16;
    int8_t _pad[2];
};

void* FactoryStack(int32_t b)
{
    Foo f(b);
    return (void*)&f;
}

void* FactoryHeap(int32_t b)
{
    Foo *pp = new Foo(b);
    return (void*)pp;
}

// Question1 作用域的GC
void main()
{
    void *p = nullptr;
    if (true)
    {
        Foo f(114);
        p = (void*)&f;
    }
    cout << p << "---" << ((Foo *)p)->i32 << endl;
    system("pause");
}
// Question2 作用域的GC
void main()
{
    void *p = nullptr;
    p = FactoryStack(114);
    cout << p << "---" << ((Foo *)p)->i32 << endl;
    system("pause");
}
// Question3 作用域的GC
void main()
{
    void *p = nullptr;
    p = FactoryHeap(114);
    cout << p << "---" << ((Foo *)p)->i32 << endl;
    system("pause");
}
// Question4 本质上是函数的理解
void main()
{
    void *p = nullptr;
    ([](void *pp)
    {
        Foo f(114);
        pp = (void*)&f;
    })(p);
    cout << p << "---" << ((Foo *)p)->i32 << endl;
    system("pause");
}
// Question5 堆上的数据去哪了?
void main()
{
    void *p = nullptr;
    ([](void *pp)
    {
        pp = new Foo(114);
    })(p);
    cout << p << "---" << ((Foo *)p)->i32 << endl;
    system("pause");
}
// Question6 这个结果是否符合预期?出了什么问题?
void main()
{
    void *p = nullptr;
    ([](void* pp)
    {
        Foo f(114);
        memcpy(pp, &f, sizeof(Foo));
    })(p);
    cout << p << "---" << ((Foo *)p)->i32 << endl;
    system("pause");
}

(所以就不应该有结构体的概念,相当于用完就丢的图纸,有用的只有内存和指针

上一篇 下一篇

猜你喜欢

热点阅读