LINUX.ORG.RU

«Раскрытие» шаблонов в C++


0

0

Шаблоны (templates) в С++ вороде обрабатываются препроцессором и передаются компилятору как обычный код. Как можно увидеть код, в который превратися шаблон при компиляции?

А то есть чужая программ с утечкой памяти и с шаблонами, причем так что один шаблон используется в другом...

И где можно почитать про то как искать утечку памяти в C++? (g++ 3.2.2)

★★★★★

Ты немного ошибаешься... Или ошибаешься сильно (в зависимости от того, какие мысли стоят за ошибочными выводами ;)). Шаблоны обрабатываются компилятором, а не препроцессором. Насчет того чтобы увидеть во что же он компилирует -- не в курсе. А если не ошибаюсь, то невозможно это...

Утечка памяти (чисто С++) достоточно удобно ловится LeakTracer-ом... Ну конечно есть и более мощные средства. ;)

tarle
()

шаблоны обрабатываются компилятором, так что увидеть ты можешь только какой-нибудь промежуточный код, например RTL.

некоторые компиляторы (cfront) сперва так и делали -- компилировали из С++ в С, но потом обнаружили что С не хватает богатства экспрессии. ИМХО это очень плохо, должен быть обязательно хороший язык, обеспечивающий слой стандартного портабельного ассемблера.

dilmah ★★★★★
()

> и с шаблонами, причем так что один шаблон используется в другом...

вообще-то это нормально, только очень осторожно надо использовать - если сделать vector<vector<int> >, то у тебя на такой объект сразу будет 4*1024*1024 байт выделено... :-/ 1024 - в разных библиотеках по разному...

Spectr ★★★
()
Ответ на: комментарий от Spectr

>вообще-то это нормально, только очень осторожно надо использовать - если сделать vector<vector<int> >, то у тебя на такой объект сразу будет 4*1024*1024 байт выделено... :-/ 1024 - в разных библиотеках по разному...

Откуда дровишки?

WFrag ★★★★
()
Ответ на: комментарий от tarle

Не ошибается он. В C++ - одноэтапный макропроцессор (в отличии от Лиспа, где есть compile time макры и runtime eval). Так что чисто теоретически семантика языка позволяет выделить код, полученный после раскрытия темплейтов. То, что реализации (мне известные) этого не умеют - проблема только криволапости авторов реализаций и их крайне слабого знакомства с теоретическими основаниями метапрограммирования.

baklan
()

А листинг разве запрещен уже? Там все видно прекрастно что во что превращается

zZzZ
()
Ответ на: комментарий от mky

-E препроцессор вывалит. Это не то

Надо типа: gcc -g main.cpp -o main.out; objdump -h -S main.out >main.lst

zZzZ
()

> А то есть чужая программ с утечкой памяти и с шаблонами, причем так что один шаблон используется в другом...

Посмотри на http://www.linkdata.se/sourcecode.html

довольно удобная штука. Мелкая и простая, тем не менее могет много чего.

yuriy123
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.