Перейти к содержанию
    

WinAVR создаёт два экземпляра конструктора

Всем привет !

 

Случайно заметил в листинге два экземпляра конструктора.

Для конструктора класса "T_PID" в листинге сpp-файла обнаружилось две функции:

_ZN5T_PIDC2Effff

_ZN5T_PIDC1Effff

 

Причём по содержанию они идентичны.

В дизасемблере (.lss) присутствуют обе функции, а используется "_ZN5T_PIDC1Effff".

 

Зачем нужен второй экземпляр ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конструктор наверное объявлен inline? Тогда это нормально. Один экземпляр - основной (на случай взятия адреса функции, отладки, или ещё чего-нибудь). А второй - встроенный по месту.

 

Вот тут подробно об этом: http://www.greenend.org.uk/rjk/2003/03/inline.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конструктор наверное объявлен inline? Тогда это нормально. Один экземпляр - основной (на случай взятия адреса функции, отладки, или ещё чего-нибудь). А второй - встроенный по месту.

 

Не инлайн .

Два экземпляра в листинге cpp-файла где он (конструктор) описан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно проблема в том что в С++, лаже если вы не обьявили их явно, создается как минимум конструктор по умолчанию(без параметров), конструктор копирования, деструктор и оператор присваивания.

Оптимизация включена?

Приведите на всякий случай описание класса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В дизасемблере (.lss) присутствуют обе функции, а используется "_ZN5T_PIDC1Effff".

 

Зачем нужен второй экземпляр ?

А фиг его знает. Чтобы весь неиспользуемый код выкидывался при линковке - добавьте -ffunction-sections -fdata-sections компилятору и --gc-sections линкеру. Если линкер вызывается через gcc, то -Wl,--gc-sections

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А фиг его знает. Чтобы весь неиспользуемый код выкидывался при линковке - добавьте -ffunction-sections -fdata-sections компилятору и --gc-sections линкеру. Если линкер вызывается через gcc, то -Wl,--gc-sections

 

Спасибо помогло.

Я сам пытался сделать тоже самое, но забыл что опции для линкера передются через "-Wl".

Изменено пользователем Vova75

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно проблема в том что в С++, лаже если вы не обьявили их явно, создается как минимум конструктор по умолчанию(без параметров), конструктор копирования, деструктор и оператор присваивания.

Оптимизация включена?

Приведите на всякий случай описание класса.

 

Нет, это не дефолтный конструктор.

Обе экземпляра абсолютно идентичны, кроме названия.

Оптимизация на это не влияет.

 

Вот простейший тест:

В h-файле:

class   T_PID {
        int _p, _i, _d;
public:
        T_PID (int  p, int  i, int  d);
};


В cpp-файле:

#include    "pid.h"
T_PID::T_PID (int p, int i, int d)  : _p(p), _i(i), _d(d)  {}


на выходе:

   1                       .file    "pid.cpp"
   2                   __SREG__ = 0x3f
   3                   __SP_H__ = 0x3e
   4                   __SP_L__ = 0x3d
   5                   __CCP__  = 0x34
   6                   __tmp_reg__ = 0
   7                   __zero_reg__ = 1
   8                       .section    .text._ZN5T_PIDC2Eiii,"ax",@progbits
   9                   .global    _ZN5T_PIDC2Eiii
  11                   _ZN5T_PIDC2Eiii:
  12                   /* prologue: function */
  13                   /* frame size = 0 */
  14 0000 FC01              movw r30,r24
  15 0002 7183              std Z+1,r23
  16 0004 6083              st Z,r22
  17 0006 5383              std Z+3,r21
  18 0008 4283              std Z+2,r20
  19 000a 3583              std Z+5,r19
  20 000c 2483              std Z+4,r18
  21                   /* epilogue start */
  22 000e 0895              ret
  24                       .section    .text._ZN5T_PIDC1Eiii,"ax",@progbits
  25                   .global    _ZN5T_PIDC1Eiii
  27                   _ZN5T_PIDC1Eiii:
  28                   /* prologue: function */
  29                   /* frame size = 0 */
  30 0000 FC01              movw r30,r24
  31 0002 7183              std Z+1,r23
  32 0004 6083              st Z,r22
  33 0006 5383              std Z+3,r21
  34 0008 4283              std Z+2,r20
  35 000a 3583              std Z+5,r19
  36 000c 2483              std Z+4,r18
  37                   /* epilogue start */
  38 000e 0895              ret

DEFINED SYMBOLS
                            *ABS*:00000000 pid.cpp
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:2      *ABS*:0000003f __SREG__
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:3      *ABS*:0000003e __SP_H__
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:4      *ABS*:0000003d __SP_L__
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:5      *ABS*:00000034 __CCP__
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:6      *ABS*:00000000 __tmp_reg__
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:7      *ABS*:00000001 __zero_reg__
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:11     .text._ZN5T_PIDC2Eiii:00000000 _ZN5T_PIDC2Eiii
C:\DOCUME~1\user\LOCALS~1\Temp/ccuP49Fw.s:27     .text._ZN5T_PIDC1Eiii:00000000 _ZN5T_PIDC1Eiii

NO UNDEFINED SYMBOLS

 

Присутствуют две идентичные функции:

_ZN5T_PIDC1Eiii

_ZN5T_PIDC2Eiii

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет !

 

Случайно заметил в листинге два экземпляра конструктора.

 

Зачем нужен второй экземпляр ?

 

 

Здесь есть ответ на Ваш вопрос

http://www.gnu.org/software/gcc/bugs.html

 

Non-bugs

....

C++

....

G++ emits two copies of constructors and destructors.

 

In general there are three types of constructors (and destructors).

 

1.The complete object constructor/destructor.

2.The base object constructor/destructor.

3.The allocating constructor/deallocating destructor.

The first two are different, when virtual base classes are involved.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...