Добавление тега span в Rails link_to

Я посмотрел на SO о том, как добавить тег , но я не увидел пример, который поместил , где я хочу использовать Rails 3 ссылка _ на :

My span My data

Я попробовал что-то вроде:

<%= link_to(content_tag{:span => "My span ", :id => "span"} @user.profile.my_data, "#", {:class => "button white"}) %>

Но это не сработало.

-121--696374-

Почему g++ хвостовой вызов не оптимизируется, пока gcc? Я хотел проверить, поддерживает ли g++ хвостовой вызов, поэтому я написал эту простую программу, чтобы проверить его: Http://ideone.com/hnXHv с использованием пространства имен std; Size_t ст; void PrintStackTop (const std:: строка &...

Я хотел проверить, поддерживает ли g++ хвостовой вызов, поэтому я написал эту простую программу, чтобы проверить его: http://ideone.com/hnXHv

using namespace std;

size_t st;

void PrintStackTop(const std::string &type)
{
    int stack_top;
    if(st == 0) st = (size_t) &stack_top;
    cout << "In " << type << " call version, the stack top is: " << (st - (size_t) &stack_top) << endl;
}

int TailCallFactorial(int n, int a = 1)
{
    PrintStackTop("tail");
    if(n < 2)
        return a;
    return TailCallFactorial(n - 1, n * a);
}

int NormalCallFactorial(int n)
{
    PrintStackTop("normal");
    if(n < 2)
        return 1;
    return NormalCallFactorial(n - 1) * n;
}


int main(int argc, char *argv[])
{
    st = 0;
    cout << TailCallFactorial(5) << endl;
    st = 0;
    cout << NormalCallFactorial(5) << endl;
    return 0;
}

Когда я скомпилировал его, обычно кажется, что g++ на самом деле не замечает никакой разницы между двумя версиями:

> g++ main.cpp -o TailCall
> ./TailCall
In tail call version, the stack top is: 0
In tail call version, the stack top is: 48
In tail call version, the stack top is: 96
In tail call version, the stack top is: 144
In tail call version, the stack top is: 192
120
In normal call version, the stack top is: 0
In normal call version, the stack top is: 48
In normal call version, the stack top is: 96
In normal call version, the stack top is: 144
In normal call version, the stack top is: 192
120

Разница стека 48 в обеих из них, в то время как версия хвостового вызова требует еще одного инт. (Почему?)
Поэтому я подумал, что оптимизация может быть полезной:

> g++ -O2 main.cpp -o TailCall
> ./TailCall
In tail call version, the stack top is: 0
In tail call version, the stack top is: 80
In tail call version, the stack top is: 160
In tail call version, the stack top is: 240
In tail call version, the stack top is: 320
120
In normal call version, the stack top is: 0
In normal call version, the stack top is: 64
In normal call version, the stack top is: 128
In normal call version, the stack top is: 192
In normal call version, the stack top is: 256
120

Размер стека увеличился в обоих случаях, и хотя компилятор может думать, что мой ЦП медленнее, чем моя память (что в любом случае не так), я не знаю, почему 80 байт необходимы для простой функции. (Почему?).
Там версия хвостового вызова также занимает больше места, чем обычная версия, и его вполне логично, если int имеет размер 16 байт. (нет, у меня нет 128-битного ЦП).
Теперь, думая, по какой причине компилятор не должен звонить, я подумал, что это могут быть исключения, потому что они тесно зависят от стека. Так что я попытался без исключений:

> g++ -O2 -fno-exceptions main.cpp -o TailCall
> ./TailCall
In tail call version, the stack top is: 0
In tail call version, the stack top is: 64
In tail call version, the stack top is: 128
In tail call version, the stack top is: 192
In tail call version, the stack top is: 256
120
In normal call version, the stack top is: 0
In normal call version, the stack top is: 48
In normal call version, the stack top is: 96
In normal call version, the stack top is: 144
In normal call version, the stack top is: 192
120

Который сокращает обычную версию обратно до неоптимизированного размера стека, в то время как оптимизированный имеет 8 байт поверх него. по-прежнему значение int не равно 8 байтам.
Я подумал, что есть что-то, что я пропустил в c++, что нужно стек устроен так что я попробовал c: http://ideone.com/tJPpc
Все еще нет хвостового вызова, но стек гораздо меньше (32 бит каждый кадр в обеих версиях). Затем я попробовал с оптимизацией:

> gcc -O2 main.c -o TailCall
> ./TailCall
In tail call version, the stack top is: 0
In tail call version, the stack top is: 0
In tail call version, the stack top is: 0
In tail call version, the stack top is: 0
In tail call version, the stack top is: 0
120
In normal call version, the stack top is: 0
In normal call version, the stack top is: 0
In normal call version, the stack top is: 0
In normal call version, the stack top is: 0
In normal call version, the stack top is: 0
120

Не только хвостовой вызов оптимизировал первый, но и хвостовой вызов оптимизировал второй!
Почему g++ не делает оптимизацию хвостового вызова, в то время как он явно доступен в платформе? есть ли способ заставить его?

10
задан sehe 18 November 2011 в 10:30
поделиться