2013-09-16 6 views
2

Я написал программу на C++ без определения какого-либо конструктора. Ниже приводится код:Принуждение компилятора предоставить конструктор по умолчанию в C++

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

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

Когда я deassembled код, я не нашел появления вызова конструктора по умолчанию. Ниже сборка фрагмент кода главной функции:

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; 
} 

Я deassembled код снова и нашел следующее:

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

Конструктор не создан, потому что он не нужен. Нечего строить. –

+0

Но когда я создаю объект, конструктор должен быть вызван, правильно ??? –

+1

Попробуйте отключить все оптимизации. –

ответ

13

Программа ведет себя как положено. Генерация машинного кода не является частью стандарта, и вы не имеете права ожидать любой конкретный вывод машинного кода — вы гарантированы только тем, что программа вывода делает то, о чем вы сказали.

+2

Например, 'static_cast (0);' является допустимым выражением, которое, вероятно, не создает никакого машинного кода; но это вполне разумный оператор C++. –

6

Почему вы хотите заставить ваш компилятор раздувать ваш бинарный файл и замедлить работу вашей программы?

Хороший компилятор будет вызывать конструктор по умолчанию (или любую другую функцию), только если это имеет смысл - если его вызвать вызовет какие-либо эффекты.

Оптимизация просто исключает вызов по умолчанию конструктора (который ничего не будет делать) из программы.

+0

чувак Я не хочу замедлять свою программу. Это был просто эксперимент ... –

1

, если я не определить любой конструктор в моем коде, не компилятор предоставлять конструктор по умолчанию во всех случаях

Нет, только если вы не определили никаких других конструкторов. Если ваш класс имеет какой-либо объявленный пользователем конструктор, то он подавляет неявное объявление конструктора по умолчанию.

Даже если вы не определяете другие конструкторы, если конструктор по умолчанию фактически не должен сделать что-нибудь, например. вызывать нетривиальный конструктор базового класса или переменной-члена, тогда он будет тривиальным и поэтому ничего не будет делать, поэтому код не должен генерироваться. Только глупый компилятор генерирует полностью пустую функцию и настаивает на том, чтобы называть ее просто ничего не делать.

Если это не так, то в каких ситуациях или, точнее, как я могу заставить компилятор предоставить конструктор по умолчанию для меня ???

Если вы хотите, чтобы он существовал, определите его, но если он ничего не делает, это пустая трата времени. Если ему нужно что-то сделать, например, построить базовые классы или переменные-члены (и он не будет подавлен другим конструктором, объявленным пользователем), то он будет создан компилятором.

Компилятор работает правильно, вам не нужно заставлять его ничего делать.

Смежные вопросы