Сколько времени шаблонная компиляция может действительно взять?

Вам нужно либо передать свою переменную в функцию. Вы можете рассматривать это как измерение безопасности. Если какая-либо функция будет видеть все глобальные переменные по умолчанию, было бы очень просто переопределить что-то в остальных ваших 50000 строках кода.

$myVar = 'asdf';

function doSomething($var){
    echo $var;
}

doSomething($myVar);

Или, если вы действительно не хотите передавать его, вы можете сделать это:

$myVar = 'asdf';

function doSomething() {

    // tell the function that it should use a global var.
    global $myVar;

    echo $myVar;
}

doSomething();

Есть еще один способ вызвать переменную непосредственно в функции:

[ 116]
  • определите вашу переменную: $myVar = 'asdf';
  • вызовите вашу переменную, где хотите, с этим синтаксисом: $GLOBALS['myVar']
    6
    задан sharptooth 22 April 2009 в 13:22
    поделиться

    3 ответа

    Я слышал, что Международная олимпиада по информатике ( один такой конкурс программирования) впервые ввел ограничения по времени компиляции после того, как участник создал 7-мерный вектор, используя технику, очень похожую на эту . Его код нужно было компилировать на ночь, это было так плохо. Я думаю, что это произошло в конце 90-х годов.

    Мы слышали, что Международная олимпиада по информатике (одно из таких соревнований по программированию) впервые ввело ограничения по времени компиляции после того, как участник создал 7-мерный вектор, используя технику, очень похожую на эту . Его код нужно было компилировать на ночь, это было так плохо. Я думаю, что это произошло в конце 90-х годов.

    Мы слышали, что Международная олимпиада по информатике (одно из таких соревнований по программированию) впервые ввело ограничения по времени компиляции после того, как участник создал 7-мерный вектор, используя технику, очень похожую на эту . Его код нужно было компилировать на ночь, это было так плохо. Я думаю, что это произошло в конце 90-х годов.

    4
    ответ дан 9 December 2019 в 20:48
    поделиться

    Механизм шаблона является полным по Тьюрингу. Это означает, что, по крайней мере, теоретически, любое вычисление, которое может быть выполнено, может быть выполнено таким образом во время компиляции (На практике вы можете столкнуться с жесткими ограничениями по глубине шаблона и т. Д. Довольно быстро, но это зависит от компилятора).

    не вы хотели бы сделать это отдельный вопрос. Вы можете тривиально соответствовать вашему критерию «часы для компиляции», используя дорогой алгоритм. Но есть и более практичные коды, такие как , реализующие БПФ ; дайте этому достаточно большой набор данных, и это займет некоторое время ...

    5
    ответ дан 9 December 2019 в 20:48
    поделиться

    Попробуйте это (я использовал Visual Studio 2005)

    template <int M, int N>
    struct Ack 
    {
        enum { value = Ack<M - 1, Ack<M, N - 1>::value >::value };
    };
    
    template <int M>
    struct Ack<M, 0> 
    {
        enum { value = Ack<M - 1, 0>::value };
    };
    
    template <>
    struct Ack<0, 0> 
    {
        enum { value = 1 };
    };
    
    template <int N>
    struct Ack<0, N> 
    {
        enum { value = N + 1 };
    };
    
    void main()
    {
        printf("Result: %d\n",  Ack<150, 150>::value);
    }
    

    Это может показаться ужасным, я просто попытался написать эквивалент этой милой функции LISP

    (defun ack(m, n)
    cond ((= m 0) (+ n 1))
         ((= n 0) ack(- m 1) n)
         (t (ack (- m 1) (ack m (-n 1))) )
    )
    

    Наш учитель сказал, что это функция Ферма, но я не уверен ...

    3
    ответ дан 9 December 2019 в 20:48
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: