Невозможно определить оператор / [ex] из gcc -fdump-tree-gimple - PullRequest
2 голосов
/ 02 февраля 2012

При компиляции C ++ с опцией -fdump-tree-gimple (GCC 4.6.1) я получаю код, в котором есть следующая функция:

std::_Vector_base<_Tp, _Alloc>::~_Vector_base() [with _Tp = int, _Alloc = std::allocator<int>] (struct _Vector_base * const this)
{
  int * D.8482;
  long int D.8483;
  int * D.8484;
  long int D.8485;
  long int D.8486;
  long int D.8487;
  long unsigned int D.8488;
  int * D.8489;
  struct _Vector_impl * D.8490;

  {
    try
      {
        D.8482 = this->_M_impl._M_end_of_storage;
        D.8483 = (long int) D.8482;
        D.8484 = this->_M_impl._M_start;
        D.8485 = (long int) D.8484;
        D.8486 = D.8483 - D.8485;
        D.8487 = D.8486 /[ex] 4;
        D.8488 = (long unsigned int) D.8487;
        D.8489 = this->_M_impl._M_start;
        std::_Vector_base<int, std::allocator<int> >::_M_deallocate(this, D.8489, D.8488);
      }
    finally
      {
        D.8490 = &this->_M_impl;
        std::_Vector_base<int, std::allocator<int>::_Vector_impl::~_Vector_impl (D.8490);
      }
  }
  <D.8393>:
}

Вы можете получить этот код, создав простую программу, которая использует std::vector<int>. В любом случае часть кода, которую я не понимаю, представляет собой строку с D.8487 = D.8486 /[ex] 4;. Я посмотрел на исходный код для /usr/include/c++/4.6.1/std_vector.h, и его деструктор является однострочным и вызывает _M_deallocate. Кто-нибудь знает, что означает оператор /[ex]? Единственное, что я заметил до сих пор, это то, что операнд RHS - это размер типа, по которому вектор параметризуется.

1 Ответ

3 голосов
/ 02 февраля 2012

/[ex] означает, что это точное выражение деления.

Из руководства по внутренним компонентам GCC:

EXACT_DIV_EXPR

Код EXACT_DIV_EXPR используется для представления целочисленных делений, где числитель, как известно, является точным кратным знаменателю. Это позволяет бэкэнду выбирать между более быстрым из TRUNC_DIV_EXPR, CEIL_DIV_EXPR и FLOOR_DIV_EXPR для текущей цели.

...