2

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

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

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

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

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

4

3 回答 3

13

程序按应有的方式运行。机器代码生成不是标准的一部分,您无权期望任何特定的机器代码输出 - 您只能保证输出程序按照您的指示进行操作。

于 2013-09-16T16:40:58.330 回答
6

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

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

优化只会从程序中排除默认构造函数(什么都不做)调用。

于 2013-09-16T16:42:24.163 回答
1

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

不,仅当您不定义任何其他构造函数时。如果您的类有任何用户声明的构造函数,那么这会抑制默认构造函数的隐式声明。

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

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

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

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

于 2013-09-16T22:34:39.773 回答