Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR создаёт два экземпляра конструктора
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Vova75
Всем привет !

Случайно заметил в листинге два экземпляра конструктора.
Для конструктора класса "T_PID" в листинге сpp-файла обнаружилось две функции:
_ZN5T_PIDC2Effff
_ZN5T_PIDC1Effff

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

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

Вот тут подробно об этом: http://www.greenend.org.uk/rjk/2003/03/inline.html
Vova75
Цитата
Конструктор наверное объявлен inline? Тогда это нормально. Один экземпляр - основной (на случай взятия адреса функции, отладки, или ещё чего-нибудь). А второй - встроенный по месту.


Не инлайн .
Два экземпляра в листинге cpp-файла где он (конструктор) описан.
kurtis
Возможно проблема в том что в С++, лаже если вы не обьявили их явно, создается как минимум конструктор по умолчанию(без параметров), конструктор копирования, деструктор и оператор присваивания.
Оптимизация включена?
Приведите на всякий случай описание класса.
Сергей Борщ
Цитата(Vova75 @ Jun 4 2009, 23:33) *
В дизасемблере (.lss) присутствуют обе функции, а используется "_ZN5T_PIDC1Effff".

Зачем нужен второй экземпляр ?
А фиг его знает. Чтобы весь неиспользуемый код выкидывался при линковке - добавьте -ffunction-sections -fdata-sections компилятору и --gc-sections линкеру. Если линкер вызывается через gcc, то -Wl,--gc-sections
Vova75
Цитата(Сергей Борщ @ Jun 5 2009, 14:47) *
А фиг его знает. Чтобы весь неиспользуемый код выкидывался при линковке - добавьте -ffunction-sections -fdata-sections компилятору и --gc-sections линкеру. Если линкер вызывается через gcc, то -Wl,--gc-sections


Спасибо помогло.
Я сам пытался сделать тоже самое, но забыл что опции для линкера передются через "-Wl".
Vova75
Цитата(kurtis @ Jun 5 2009, 10:17) *
Возможно проблема в том что в С++, лаже если вы не обьявили их явно, создается как минимум конструктор по умолчанию(без параметров), конструктор копирования, деструктор и оператор присваивания.
Оптимизация включена?
Приведите на всякий случай описание класса.


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

Вот простейший тест:
Код
В 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
aesok
Цитата(Vova75 @ Jun 5 2009, 00:33) *
Всем привет !

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

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



Здесь есть ответ на Ваш вопрос
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.
Vova75
Цитата(aesok @ Jun 6 2009, 10:13) *
Здесь есть ответ на Ваш вопрос
http://www.gnu.org/software/gcc/bugs.html

Спасибо, понял.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.