На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> constexpr-функции
    Есть вот такой простенький код. Компилирую на gcc 8.2, -O3 -std=c++17, смотрю ассемблерный код.
    Вижу, что std::char_traits<char>::length всегда вычисляется в compile-time, а CTest<char>::length - в случае вызова из Test() - в runtime.
    Почему так?

    ExpandedWrap disabled
      template <typename TChar>
      struct CTest
      {
          static constexpr size_t length(const TChar *psz) noexcept
          {
          size_t sz = 0;
          while (psz[sz] != TChar())
                  ++sz;
              return sz;
          }
      };
       
      inline
      constexpr void Test(const char *psz) noexcept
      {
          const auto sz1= std::char_traits<char>::length(psz); //compile-time
          const auto sz2 = CTest<char>::length(psz); //RUNTIME!!!!
          printf("%u, %u", sz1, sz2);
      }
       
      int main()
      {
          static constexpr char _psz[] = "12345678901234567";
          
          Test(_psz);
          
          const auto sz1 = std::char_traits<char>::length(_psz); //compile-time
          const auto sz2 = CTest<char>::length(_psz); //compile-time
          printf("%u, %u", sz1, sz2);
       
          return 0;
      }
      Хотелось бы посмотреть текст std::char_traits<char>::length() из C++17, но сдаётся мне, что это фича компилера, распознающего стандартные сигнатуры наподобие intrinsic.
        Цитата Олег М @
        Хотелось бы посмотреть текст std::char_traits<char>::length()

        Я оттуда свою функцию и скопировал


        Цитата Qraizer @
        но сдаётся мне, что это фича компилера, распознающего стандартные сигнатуры наподобие intrinsic.


        Тоже подозреваю. Уже не впервый раз замечаю, что мои классы и стандартные, std::string например, компилируются по-разному. Фигово.
          Цитата Qraizer @
          сдаётся мне, что это фича компилера, распознающего стандартные сигнатуры наподобие intrinsic.
          Ещё некоторые компиляторы смотрят, откуда читается текущий текст - из папки проекта или из папки стандартных заголовков. При копировании заголовочного файла в свою папку вдруг появляются новые предупреждения и результат компиляции отличается.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0312 ]   [ 17 queries used ]   [ Generated: 28.03.24, 22:02 GMT ]