2014-12-16 2 views
4
#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; 
} 
+0

Какие параметры оптимизации вы использовали, и с какой компилятор и версия? Кроме того, что произойдет, если вы используете 'constexpr const char * p =" 1234567 ";' вместо этого? (Проблема может возникнуть из-за того, что 'p' сам не является' constexpr', и поэтому компилятор отбрасывает оценку 'constLength (p)' до времени выполнения.) – cdhowie

+0

Я пробовал. Но это также приводит к непроизводительным затратам времени выполнения. –

+0

@ShafikYaghmour Функция 'constexpr' * может * быть оценена во время компиляции, если ее аргументы являются постоянными выражениями. Единственный способ гарантировать *, что он будет оцениваться во время компиляции, - это выполнить оценку в контексте, который требует постоянного выражения. – Casey

ответ

7

constexpr функция может быть оценена только во время компиляции, когда вызывается с аргументами, которые являются константами времени компиляции. Хотя значение p может быть определено статическим анализом (оно не изменяется между инициализацией и оценкой), оно не является постоянным выражением в стандартном определении.

Попробуйте это:

constexpr const char* p = "1234567"; 

Кроме того, вы можете гарантировать, что инициализация выполнимо без накладных расходов во время выполнения, объявив инициализированную переменную constexpr:

constexpr size_t i = constLength(p); 
+0

1.I попробовал constexpr const char * p = "1234567". Но я получил тот же код разборки, что и в первый раз.2. Я попробовал constexpr size_t i = constLength ("1234567"), а затем получил ошибку компиляции: Severity \t Описание \t \t Project File \t Line ошибка \t ошибка C2127: «я»: недопустимая инициализация «constexpr» лица с непостоянным выражением –

+1

@LeonhartSquall Это звучит подозрительно, как ошибка компилятора тогда. – cdhowie

+0

@LeonhartSquall [работает для меня] (http://coliru.stacked-crooked.com/a/b0650b8eb11a6859) – Potatoswatter

Смежные вопросы