#include <stdio.h>
constexpr size_t constLength(const char* str)
{
return (*str == 0) ? 0 : constLength(str + 1) + 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
const char* p = "1234567";
size_t i = constLength(p);
printf(p);
printf("%d", i);
return 0;
}
Привета, все Я хочу, чтобы получить длину строки в compile-time.So я написал код above.But в разборке коды я нашел ' функция constLength», что названный sub_401000 ниже приведет время выполнения накладных расходов для computting длину string.Is там что-то не так? (Visual Studio 2015 Preview, выпуск с максимальной производительностью (/ O2) оптимизации)C++ 11 прибудет длину строки во время компиляции с помощью constexpr
int __cdecl sub_401010()
{
int v0; // [email protected]
v0 = sub_401000("234567") + 1;
sub_401040(&unk_402130);
sub_401040("%d");
return 0;
}
int __thiscall sub_401000(void *this)
{
int result; // [email protected]
if (*(_BYTE *)this)
result = sub_401000((char *)this + 1) + 1;
else
result = 0;
return result;
}
Какие параметры оптимизации вы использовали, и с какой компилятор и версия? Кроме того, что произойдет, если вы используете 'constexpr const char * p =" 1234567 ";' вместо этого? (Проблема может возникнуть из-за того, что 'p' сам не является' constexpr', и поэтому компилятор отбрасывает оценку 'constLength (p)' до времени выполнения.) – cdhowie
Я пробовал. Но это также приводит к непроизводительным затратам времени выполнения. –
@ShafikYaghmour Функция 'constexpr' * может * быть оценена во время компиляции, если ее аргументы являются постоянными выражениями. Единственный способ гарантировать *, что он будет оцениваться во время компиляции, - это выполнить оценку в контексте, который требует постоянного выражения. – Casey