Мне интересно, при создании двух объектов одного класса у них будут свои копии методов или они будут ссылаться на одни и теже методы.
для разных объектов выделяются разные места (естественно) для членов класса, а методы конечно в одном экземпляре. Насколько я помню, по соглашению thiscall им просто в регистре ECX передается указатель на объект (доступен как this)
Код (Text): class MyClass { int a; char b; public: void method() { this->a = 0; this->b = 1; } }; void main() { MyClass a,b; a.method(); b.method(); } В IDA Pro: Код (Text): .text:004001E0 start proc near .text:004001E0 .text:004001E0 b = dword ptr -10h .text:004001E0 a = dword ptr -8 .text:004001E0 .text:004001E0 push ebp .text:004001E1 mov ebp, esp .text:004001E3 sub esp, 10h [b].text:004001E6 lea ecx, [ebp+a] .text:004001E9 call MyClass__method[/b] [b].text:004001EE lea ecx, [ebp+b] .text:004001F1 call MyClass__method[/b] .text:004001F6 mov esp, ebp .text:004001F8 pop ebp .text:004001F9 retn .text:004001F9 start endp .text:00400200 MyClass__method proc near ; CODE XREF: start+9p .text:00400200 ; start+11p .text:00400200 .text:00400200 this = dword ptr -4 .text:00400200 .text:00400200 push ebp .text:00400201 mov ebp, esp .text:00400203 push ecx .text:00400204 mov [ebp+this], ecx .text:00400207 mov eax, [ebp+this] .text:0040020A mov dword ptr [eax], 0 .text:00400210 mov ecx, [ebp+this] .text:00400213 mov byte ptr [ecx+4], 1 .text:00400217 mov esp, ebp .text:00400219 pop ebp .text:0040021A retn .text:0040021A MyClass__method endp
Great как быть для не х86-процессов? P.S. про ecx актуально только для vc стандарт не описывает бинарные представления классов
у thiscall'а вообще разве есть какая-то спецификация? насколько я понимаю, в разных компилерах под этим словом понимаются совершенно разные модели вызовов. часто this передается просто как первый скрытый аргумент в стеке, и иногда этим даже можно управлять с помощью опций (watcom, если не ошибаюсь)
На усмотрение компилятора. Например, VC может заинлайнить метод, объединить полностью или частично методы, имеющие бинарно идентичный код, ... В общем, бинарное представление кода программы иногда может оказаться большим сюрпризом. То же и насчёт thiscall - конвенции вызова для внутренних (т.е. в рамках одного контекста компиляции (compilation scope) и недоступных извне этого контекста) ф-ций компилятором не соблюдаются.
забыл сказать, что я имел в виду vc, конечно. встречал и передачу в стеке, и в других регистрах. такое тоже бывает )
maxdiver 1. если они не инлайнятся 2. плохо себе представляю, что будет с методами, полученными при одинаковом инстацировании шаблонов в разных объектниках (не разбирался и неохота)
вот это, кстати, фиг знает... в любом случае, топикстартеру, я думаю, это нужно под конкретный компилер, так что пущай собирает им и дизассемблит.
Я имел в виду методы, т.е. настоящие функции, будут в одном экземпляре. То, что инлайнится - это фактически не отдельная функция, а просто последовательность команд, вставляемых в код. Короче, понятно наверное
есть такая штука - ABI - application binary interface - которая как раз и описывает физические структуры для классов, виртуальных функций и т.п. Код от разных компиляторов, соблюдающих одну и ту-же ABI будет успешно линковатся и работать.
Помнится, когда-то я эту тему поднимал и мне не смышленому форумчане поясняли как и что делается. А вообще, стандарт языка одно, а вот его реализация совершенно другое! Так что то, что выглядит внутри для MS VC++ может сильно отличаться от того что делает GCC. автор: или убей себя об угол стола или забей на это! Потрать силу программерскую лучше на более умное(прибыльное) для себя дело! ИМХО конечно
green Ну а че толку изучать, как устроен класс, если в данный момент это не приносит тебе денег, которые можно потратить на семью, покупку компа или еще бог весть что? Уж лучше взяться за изучение технологии .NET и как там все устроено, это еще перспективно - один фиг все там будем, хотим этого или нет!
Если автору делать не фиг, могу подкинуть задачек, которые действительно пользу принесут и ему и обществу и интресны
Помнится ты ещё недавно писал дизассемблер и дизассемблировал инструкции на листочке. Ни первое, ни второе нахрен никому не надо и денег тоже не принесло. Я всё понимаю, можешь не объяснять в принципе... Эволюция, мать её.
EvilsInterrupt > это не приносит тебе денег, которые можно потратить на семью, покупку компа... +1000 за правильные приортеты)))) Нас так мало осталось))))
W4FhLF Почему не принесло? Принесло, часть проектов на работе упадет в момент моего ухода,т.к. небольшая фича работает, которую наши не будут ломат - они этого бояться(хотя там и не сложно ломать). Ведь после моего увольнения, если оно будет, мы программы не обязаны работать.
Oxaid Если интересно, то могу предложить одну идейку, но после оформления бумаг, по которым 25% отойдет мне - за подсказку