强制编译器在C ++中提供默认构造函数

时间:2013-09-16 16:39:00

标签: c++ constructor

我编写了一个C ++程序而没有定义任何构造函数。以下是代码:

#include<iostream>
using namespace std;
class test
{
    public:

        void print()
        {
            cout<< "Inside Print"<<endl;
        }
};
int main()
{
   test t;
   t.print();
   return 0;
}

当我解组代码时,我没有发现任何调用默认构造函数的情况。以下是主要功能的汇编代码片段:

8 main:
      9 .LFB1516:
     10         pushl   %ebp
     11 .LCFI0:
     12         movl    %esp, %ebp
     13 .LCFI1:
     14         subl    $8, %esp
     15 .LCFI2:
     16         andl    $-16, %esp
     17         movl    $0, %eax
     18         subl    %eax, %esp
     19         leal    -1(%ebp), %eax
     20         movl    %eax, (%esp)
     21         call    _ZN4test5printEv
     22         movl    $0, %eax
     23         leave
     24         ret

如您所见,上述代码段中只有一条call指令(第21行)。它正在调用print()函数。现在我稍微修改了我的代码并引入了constructor。以下是代码:

#include<iostream>
using namespace std;
class test
{
    public:
        test()
        {
        }
        void print()
        {
            cout<< "Inside Print"<<endl;
        }
};
int main()
{
    test t;
    t.print();
    return 0;
}

我再次拆解代码并找到以下内容:

 8 main:
      9 .LFB1519:
     10         pushl   %ebp
     11 .LCFI0:
     12         movl    %esp, %ebp
     13 .LCFI1:
     14         subl    $8, %esp
     15 .LCFI2:
     16         andl    $-16, %esp
     17         movl    $0, %eax
     18         subl    %eax, %esp
     19         leal    -1(%ebp), %eax
     20         movl    %eax, (%esp)
     21         call    _ZN4testC1Ev
     22         leal    -1(%ebp), %eax
     23         movl    %eax, (%esp)
     24         call    _ZN4test5printEv
     25         movl    $0, %eax
     26         leave
     27         ret

如您所见,它在第21行调用了构造函数。 现在我的问题是,如果我没有在我的代码中定义任何构造函数,编译器是否在所有情况下都提供默认构造函数?如果没有,那么在什么情况下,或者我怎样才能强制编译器为我提供默认构造函数???

对于冗长的问题抱歉:P

3 个答案:

答案 0 :(得分:13)

程序应该按行为。机器代码生成不是标准的一部分,您无权期望任何特定的机器代码输出 - 您只能保证输出程序完成您告诉它的操作。

答案 1 :(得分:6)

为什么要强制你的编译器膨胀你的二进制文件并减慢你的程序?

好的编译器只会在有意义的情况下调用默认构造函数(或任何其他函数) - 如果调用它会产生任何效果。

优化只会从程序中排除默认构造函数(无效)。

答案 2 :(得分:1)

  

如果我没有在我的代码中定义任何构造函数,编译器在所有情况下都不提供默认构造函数

不,仅当您没有定义任何其他构造函数时。如果您的类具有任何用户声明的构造函数,那么将禁止默认构造函数的隐式声明。

即使您没有定义其他构造函数,除非默认构造函数实际上必须执行某些操作,例如调用基类或成员变量的非平凡构造函数,然后它将是微不足道的,因此将不执行任何操作,因此不需要生成任何代码。只有一个愚蠢的编译器会生成一个完全空的函数,并坚持只是为了什么都不做而调用它。

  

如果没有,那么在什么情况下或者我怎样才能强制编译器为我提供默认构造函数???

如果你想确保它存在,那么定义它,但如果它什么也不做,那就浪费时间了。如果它需要执行诸如构造基类或成员变量之类的事情(并且它不被另一个用户声明的构造函数抑制),那么它将由编译器创建。

编译器正在做正确的事情,你不需要强迫它做任何事情。