Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: Poopy Joe Бельгия  
Дата: 26.10.15 08:31
Оценка:
Здравствуйте, Tilir, Вы писали:

T>А исходный тестик в топике ни у кого интерес не отбивает. Как раз наоборот, студенты с энтузиазмом лезут в закоулки языка, ещё и оттаскивать приходится. И потом, когда начинаются действительно сложные вещи, связанные с ООП и шаблонами, где ловушек куда больше и они гораздо менее бесхитростны, у ребят уже накоплен опыт исследования, позволяющий разбираться в таких вещах и не бояться их.


Т.е. вместо того, что бы писать понятный, поддерживаемый код, студенты с энтузиазмом начинают учится расставлять ловушки, потому что они не боятся их?
Re[3]: Тест по базовому C++ -- интересно ваше мнение
От: B0FEE664  
Дата: 27.10.15 13:41
Оценка:
Здравствуйте, Tilir, Вы писали:

A>>8) зачем знать есть ли op< у указателя на функцию, или его нет?

T>Важно понимание что вообще такое указатель на функцию физически и что функции могут как угодно лечь при линковке.

Вы так пишите, что можно подумать, что есть гарантии, что код:
void foo () { printf ("%d%d\n", max(one, two)(), max(one, two)()); }

выдаст либо 11, либо 22, но не 21 и не 12. А ведь таких гарантий нет, не так ли?
И каждый день — без права на ошибку...
Re[7]: Тест по базовому C++ -- интересно ваше мнение
От: VTT http://vtt.to
Дата: 28.10.15 21:04
Оценка:
T>В языке C, если вы пишете

T>
T>int foo (int x)
T>


T>то в ассемблере вы получите метку


T>

T>foo:


T>Вы получите её всегда. Имена функций в C не манглируются. В C++ для этого используется extern "C".


VTT>> Функции-члены, пространства имен, перегрузка, шаблоны и прочее тут ни при чем.


T>Без манглирования имён перечисленное невозможно. Подумайте почему.


T>Вообще я пришёл сюда спрашивать о тесте, а не заниматься ликбезом. Ваше мнение я услышал, спасибо. Про структуры и прочее может быть где-нибудь прочитаете. А может и нет, вам, судя по всему, не надо.


Вы только перед студентам такие "познания" не вываливайте.
К вашему сведению сопоставление адресов методов (и данных) с символическими именами в виде ASCII-строчки — это тяжелое наследие прежних времен, бремя совместимости с которым приходится волочить до сих пор. И, соответственно, mangled имена в С++ — это самый обыкновенный костыль чтобы избежать необходимости править формат исполняемых файлов. В свое время кто-то просто срезал угол и вместо нормальных метаданных запилил name mangling чтобы сложные наименования с пространствами имен, перегрузками и прочим могли были представлены в виде все тех же ASCII строчек.
Метки в ассемблере могут иметь место только если имеется сопоставление адреса с символическим именем, которое может браться например из таблиц импортов / экспортов или из дебаг информации. Когда есть исходники — то это вообще не проблема. Но если исходников нет, а таблицы содержат mangled имена (или не содержат их вообще), то никаких толковых меток вы в ассемблере не увидите при всем желании.
Импортируемыми именами методов что в С, что в С++ можно достаточно свободно манипулировать. Достаточно написать свой .def файл. Советую поупражняться на досуге.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.