Я посмотрел на 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++ хвостовой вызов, поэтому я написал эту простую программу, чтобы проверить его: 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++ не делает оптимизацию хвостового вызова, в то время как он явно доступен в платформе? есть ли способ заставить его?