реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> WinAVR создаёт два экземпляра конструктора
Vova75
сообщение Jun 4 2009, 20:33
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 11-08-08
Из: г. Тверь
Пользователь №: 39 554



Всем привет !

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

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

Зачем нужен второй экземпляр ?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 4 2009, 22:45
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Vova75
сообщение Jun 4 2009, 23:40
Сообщение #3





Группа: Участник
Сообщений: 10
Регистрация: 11-08-08
Из: г. Тверь
Пользователь №: 39 554



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


Не инлайн .
Два экземпляра в листинге cpp-файла где он (конструктор) описан.
Go to the top of the page
 
+Quote Post
kurtis
сообщение Jun 5 2009, 06:17
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Возможно проблема в том что в С++, лаже если вы не обьявили их явно, создается как минимум конструктор по умолчанию(без параметров), конструктор копирования, деструктор и оператор присваивания.
Оптимизация включена?
Приведите на всякий случай описание класса.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 5 2009, 10:47
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Vova75 @ Jun 4 2009, 23:33) *
В дизасемблере (.lss) присутствуют обе функции, а используется "_ZN5T_PIDC1Effff".

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Vova75
сообщение Jun 5 2009, 20:58
Сообщение #6





Группа: Участник
Сообщений: 10
Регистрация: 11-08-08
Из: г. Тверь
Пользователь №: 39 554



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


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

Сообщение отредактировал Vova75 - Jun 5 2009, 20:59
Go to the top of the page
 
+Quote Post
Vova75
сообщение Jun 5 2009, 23:16
Сообщение #7





Группа: Участник
Сообщений: 10
Регистрация: 11-08-08
Из: г. Тверь
Пользователь №: 39 554



Цитата(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
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 6 2009, 06:13
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(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.
Go to the top of the page
 
+Quote Post
Vova75
сообщение Jun 6 2009, 10:28
Сообщение #9





Группа: Участник
Сообщений: 10
Регистрация: 11-08-08
Из: г. Тверь
Пользователь №: 39 554



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

Спасибо, понял.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016