Vova75 0 4 июня, 2009 Опубликовано 4 июня, 2009 · Жалоба Всем привет ! Случайно заметил в листинге два экземпляра конструктора. Для конструктора класса "T_PID" в листинге сpp-файла обнаружилось две функции: _ZN5T_PIDC2Effff _ZN5T_PIDC1Effff Причём по содержанию они идентичны. В дизасемблере (.lss) присутствуют обе функции, а используется "_ZN5T_PIDC1Effff". Зачем нужен второй экземпляр ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 4 июня, 2009 Опубликовано 4 июня, 2009 · Жалоба Конструктор наверное объявлен inline? Тогда это нормально. Один экземпляр - основной (на случай взятия адреса функции, отладки, или ещё чего-нибудь). А второй - встроенный по месту. Вот тут подробно об этом: http://www.greenend.org.uk/rjk/2003/03/inline.html Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vova75 0 4 июня, 2009 Опубликовано 4 июня, 2009 · Жалоба Конструктор наверное объявлен inline? Тогда это нормально. Один экземпляр - основной (на случай взятия адреса функции, отладки, или ещё чего-нибудь). А второй - встроенный по месту. Не инлайн . Два экземпляра в листинге cpp-файла где он (конструктор) описан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kurtis 0 5 июня, 2009 Опубликовано 5 июня, 2009 · Жалоба Возможно проблема в том что в С++, лаже если вы не обьявили их явно, создается как минимум конструктор по умолчанию(без параметров), конструктор копирования, деструктор и оператор присваивания. Оптимизация включена? Приведите на всякий случай описание класса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 120 5 июня, 2009 Опубликовано 5 июня, 2009 · Жалоба В дизасемблере (.lss) присутствуют обе функции, а используется "_ZN5T_PIDC1Effff". Зачем нужен второй экземпляр ? А фиг его знает. Чтобы весь неиспользуемый код выкидывался при линковке - добавьте -ffunction-sections -fdata-sections компилятору и --gc-sections линкеру. Если линкер вызывается через gcc, то -Wl,--gc-sections Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vova75 0 5 июня, 2009 Опубликовано 5 июня, 2009 (изменено) · Жалоба А фиг его знает. Чтобы весь неиспользуемый код выкидывался при линковке - добавьте -ffunction-sections -fdata-sections компилятору и --gc-sections линкеру. Если линкер вызывается через gcc, то -Wl,--gc-sections Спасибо помогло. Я сам пытался сделать тоже самое, но забыл что опции для линкера передются через "-Wl". Изменено 5 июня, 2009 пользователем Vova75 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vova75 0 5 июня, 2009 Опубликовано 5 июня, 2009 · Жалоба Возможно проблема в том что в С++, лаже если вы не обьявили их явно, создается как минимум конструктор по умолчанию(без параметров), конструктор копирования, деструктор и оператор присваивания. Оптимизация включена? Приведите на всякий случай описание класса. Нет, это не дефолтный конструктор. Обе экземпляра абсолютно идентичны, кроме названия. Оптимизация на это не влияет. Вот простейший тест: В 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 0 6 июня, 2009 Опубликовано 6 июня, 2009 · Жалоба Всем привет ! Случайно заметил в листинге два экземпляра конструктора. Зачем нужен второй экземпляр ? Здесь есть ответ на Ваш вопрос 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 0 6 июня, 2009 Опубликовано 6 июня, 2009 · Жалоба Здесь есть ответ на Ваш вопрос http://www.gnu.org/software/gcc/bugs.html Спасибо, понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться