诡异的编译器行为

    技术2022-05-20  38

    先看几个例子:

    例1:

    class A

    {

    public:

       inline void get(){cout<<"a"<<endl;}

    };

     

    A a;

    a.get();        

     //这里,内联函数会展开吗。

    //答案是不会,因它里边包含了函数调用,编译器会把内联忽略掉

     

    例2:

    class A

    {

    public:

       A(A& a){this->x = 555;}

     

       A& operator=(int  b)

      {

         this->x = 444;

         return *this;

      }

     

       int x;

    }

     

    A a;

    a = 2;

    cout<<a.x<<endl;

    是否正确,答案是正确。

    输出结果是多少?

    可能第一感觉是要么就444,要么就555,结果是2.

     

     

    例3:

    class A

    {

       int a;

    };

    编译器是否会为这个类添加构造函数、析构函数、赋值函数、拷贝构造函数?

    答案是不一定,得看需要而定。

     

     

     

    结论:

    编译器会为我们做很多事情,很多时候,编译器生成的代码已经跟我们想要的代码差很多了。

    编译器不一定会为每个类生成构造函数、析构函数、赋值函数、拷贝构造函数。

    也不一定复制的时候就调用代码中的拷贝构造函数,C++编译器会在某种程序上改变代码的布局。

    总之,不要过分的把编译器的行为相当然,先入为主的思想可能会把自己陷入深深的困境之中。

     

     


    最新回复(0)