LINUX.ORG.RU

Что бы почитать по С++?


0

3

Внезапно осознал, что очень плохо понимаю принципы работы с++.
Например, что такое класс на самом низком уровне. Если с вызовами функций все примерно ясно - кладем параметры в стек, дергаем CALL, то с методами классов не очень. Как устанавливается this когда вызывается метод, как работают виртуальные методы?
Подкиньте литературы по этому вопросу, пожалуйста.

★★★★☆

У Криса Касперского была книжка.
Где все на низком уровне расписано.
В плоть дисассемблерного листинга

Bragin
()

Если с вызовами функций все примерно ясно - кладем параметры в стек

Fail.

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

Можно с этого места подробней?

Способ передачи параметров зависит от ABI платформы/компилятора. gcc по-умолчанию для i386 первые три параметра передаёт через регистры (если параметр в регистр помещается), а для x86-64 целых 6.

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

Ага. Я понимаю, мне и интересно, что получается в скомпилированном коде. Сижу сейчас смотрю в objdump, но понимаю мало.

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

Это старая статья, и только про x86 и про Си.

Я выше подробную статью привел.

Если вкратце, «this» это неявный аргумент, он не «устанавливается», он передается при вызове. Виртуальные методы работают через таблицу виртуальных функций(банально массив указателей на функции), которая для класса-наследника включает в себя таблицу класса-родителя.

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

>Виртуальные методы работают через таблицу виртуальных функций(банально массив указателей на функции), которая для класса-наследника включает в себя таблицу класса-родителя.

А как с множественным наследованием?

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

Если у нас класс C наследуется от A и B, то номер 0 в таблице виртуальных функций будет соответствовать переопределённой функции класса A или B? И что произойдёт, когда мы указатель на объект класса С передаём в функцию, ожидающую A или B?

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

> Если у нас класс C наследуется от A и B, то номер 0 в таблице виртуальных функций будет соответствовать переопределённой функции класса A или B?

Обычно таблицы виртуальных функций базовых классов размещаются в порядке наследования базовых классов.

И что произойдёт, когда мы указатель на объект класса С передаём в функцию, ожидающую A или B?

Компилятор сам подставит правильное значение указателя.

anonymous
()

Зачем тебе все это знать? Детали реализации зависят от железа, операционной системы и желаний разработчиков.

Почему вопросы такого рода гораздо реже возникают у жабистов, шарпистов, лисперов и т.д.?

anonymous
()
Ответ на: комментарий от Boy_from_Jungle

Я знаю приблизительно и хочу уточнить)

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

При повышающем приведении никакой магии, вот при понижающем уже становиться интересно )

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