Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация и сгенерированный конструктор
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Непомнящий Евгений
Натолкнулся на интересную штуку.

Вот такой код:
Код
struct Test
{
};

int main()
{
  Test(); //********

  return 1;
}


Помеченное компилится в:
Код
     94            Test();
   \   0000000A   E021               LDI     R18, 1
   \   0000000C   E030               LDI     R19, 0
   \   0000000E   018E               MOVW    R17:R16, R29:R28
   \   00000010   ........           CALL    __near_memzero


А если в Test запихнуть пустой конструктор
Код
struct Test
{
  Test() {}
};


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

Насколько я все это понимаю, автоматически сгенерированный конструктор очищает память (кстати - почему? У Страуструпа написано, что члены встроенных типов не инициализируются), причем оптимизатор почему-то спотыкается и все это не удаляет...


IAR C/C++ Compiler for AVR 4.30A/W32 (4.30.1.3), максимальная оптимизация по скорости (s9)
Непомнящий Евгений
Компилятор ведет себя по стандарту

8.5/5
To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;
— if T is an array type, then each element is value-initialized;
— otherwise, the object is zero-initialized


8.5/7
An object whose initializer is an empty set of parentheses, i.e., (), shall be value-initialized.


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