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

Forcing the compiler to provide default constructor in C++

本文关键字:默认 构造函数 C++ 编译器      更新时间:2023-10-16

我编写了一个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冗长的问题

程序的行为符合预期。机器代码生成不是标准的一部分,您无权期望任何特定的机器代码输出 - 您只能保证输出程序按照您的要求进行操作。

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

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

优化将仅从程序中排除默认构造函数(它不会执行任何操作)调用。

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

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

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

如果没有,那么在什么情况下,或者更确切地说,我如何强制编译器为我提供默认构造函数???

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

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