Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.208.172.3] |
|
Сообщ.
#1
,
|
|
|
Есть вот такой простенький код. Компилирую на gcc 8.2, -O3 -std=c++17, смотрю ассемблерный код.
Вижу, что std::char_traits<char>::length всегда вычисляется в compile-time, а CTest<char>::length - в случае вызова из Test() - в runtime. Почему так? 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; } |
Сообщ.
#2
,
|
|
|
Хотелось бы посмотреть текст std::char_traits<char>::length() из C++17, но сдаётся мне, что это фича компилера, распознающего стандартные сигнатуры наподобие intrinsic.
|
Сообщ.
#3
,
|
|
|
Цитата Олег М @ Хотелось бы посмотреть текст std::char_traits<char>::length() Я оттуда свою функцию и скопировал Цитата Qraizer @ но сдаётся мне, что это фича компилера, распознающего стандартные сигнатуры наподобие intrinsic. Тоже подозреваю. Уже не впервый раз замечаю, что мои классы и стандартные, std::string например, компилируются по-разному. Фигово. |
Сообщ.
#4
,
|
|
|
Цитата Qraizer @ Ещё некоторые компиляторы смотрят, откуда читается текущий текст - из папки проекта или из папки стандартных заголовков. При копировании заголовочного файла в свою папку вдруг появляются новые предупреждения и результат компиляции отличается. сдаётся мне, что это фича компилера, распознающего стандартные сигнатуры наподобие intrinsic. |