Что из себя представляет класс физически

Тема в разделе "LANGS.C", создана пользователем Oxaid, 15 май 2007.

  1. Oxaid

    Oxaid New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    2
    Мне интересно, при создании двух объектов одного класса у них будут свои копии методов или они будут ссылаться на одни и теже методы.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    для разных объектов выделяются разные места (естественно) для членов класса, а методы конечно в одном экземпляре.
    Насколько я помню, по соглашению thiscall им просто в регистре ECX передается указатель на объект (доступен как this)
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Код (Text):
    1. class MyClass
    2. {
    3.     int a;
    4.     char b;
    5. public:
    6.     void method()
    7.     {
    8.         this->a = 0;
    9.         this->b = 1;
    10.     }
    11. };
    12.  
    13. void main()
    14. {
    15.     MyClass a,b;
    16.     a.method();
    17.     b.method();
    18. }
    В IDA Pro:

    Код (Text):
    1. .text:004001E0 start           proc near
    2. .text:004001E0
    3. .text:004001E0 b               = dword ptr -10h
    4. .text:004001E0 a               = dword ptr -8
    5. .text:004001E0
    6. .text:004001E0                 push    ebp
    7. .text:004001E1                 mov     ebp, esp
    8. .text:004001E3                 sub     esp, 10h
    9.  
    10. [b].text:004001E6                 lea     ecx, [ebp+a]
    11. .text:004001E9                 call    MyClass__method[/b]
    12.  
    13. [b].text:004001EE                 lea     ecx, [ebp+b]
    14. .text:004001F1                 call    MyClass__method[/b]
    15.  
    16. .text:004001F6                 mov     esp, ebp
    17. .text:004001F8                 pop     ebp
    18. .text:004001F9                 retn
    19. .text:004001F9 start           endp
    20.  
    21. .text:00400200 MyClass__method proc near               ; CODE XREF: start+9p
    22. .text:00400200                                         ; start+11p
    23. .text:00400200
    24. .text:00400200 this            = dword ptr -4
    25. .text:00400200
    26. .text:00400200                 push    ebp
    27. .text:00400201                 mov     ebp, esp
    28.  
    29. .text:00400203                 push    ecx
    30. .text:00400204                 mov     [ebp+this], ecx
    31.  
    32. .text:00400207                 mov     eax, [ebp+this]
    33. .text:0040020A                 mov     dword ptr [eax], 0
    34.  
    35. .text:00400210                 mov     ecx, [ebp+this]
    36. .text:00400213                 mov     byte ptr [ecx+4], 1
    37.  
    38. .text:00400217                 mov     esp, ebp
    39. .text:00400219                 pop     ebp
    40. .text:0040021A                 retn
    41. .text:0040021A MyClass__method endp
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Great
    как быть для не х86-процессов?

    P.S. про ecx актуально только для vc

    стандарт не описывает бинарные представления классов
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    у thiscall'а вообще разве есть какая-то спецификация? насколько я понимаю, в разных компилерах под этим словом понимаются совершенно разные модели вызовов. часто this передается просто как первый скрытый аргумент в стеке, и иногда этим даже можно управлять с помощью опций (watcom, если не ошибаюсь)
     
  6. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    На усмотрение компилятора.
    Например, VC может заинлайнить метод, объединить полностью или частично методы, имеющие бинарно идентичный код, ...
    В общем, бинарное представление кода программы иногда может оказаться большим сюрпризом. :)

    То же и насчёт thiscall - конвенции вызова для внутренних (т.е. в рамках одного контекста компиляции (compilation scope) и недоступных извне этого контекста) ф-ций компилятором не соблюдаются.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    забыл сказать, что я имел в виду vc, конечно.
    встречал и передачу в стеке, и в других регистрах.
    такое тоже бывает )
     
  8. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Но методы, как ни крути, будут в одном экземпляре.
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    maxdiver
    1. если они не инлайнятся
    2. плохо себе представляю, что будет с методами, полученными при одинаковом инстацировании шаблонов в разных объектниках (не разбирался и неохота)
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вот это, кстати, фиг знает... в любом случае, топикстартеру, я думаю, это нужно под конкретный компилер, так что пущай собирает им и дизассемблит.
     
  11. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Я имел в виду методы, т.е. настоящие функции, будут в одном экземпляре. То, что инлайнится - это фактически не отдельная функция, а просто последовательность команд, вставляемых в код. Короче, понятно наверное :)
     
  12. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    есть такая штука - ABI - application binary interface - которая как раз и описывает физические структуры для классов, виртуальных функций и т.п. Код от разных компиляторов, соблюдающих одну и ту-же ABI будет успешно линковатся и работать.
     
  13. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Помнится, когда-то я эту тему поднимал и мне не смышленому форумчане поясняли как и что делается.
    А вообще, стандарт языка одно, а вот его реализация совершенно другое! Так что то, что выглядит внутри для MS VC++ может сильно отличаться от того что делает GCC.

    автор: или убей себя об угол стола или забей на это! Потрать силу программерскую лучше на более умное(прибыльное) для себя дело! ИМХО конечно
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt
    И это говорит Постигающий азы дзена... :derisive:
     
  15. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    green
    Ну а че толку изучать, как устроен класс, если в данный момент это не приносит тебе денег, которые можно потратить на семью, покупку компа или еще бог весть что? Уж лучше взяться за изучение технологии .NET и как там все устроено, это еще перспективно - один фиг все там будем, хотим этого или нет! :dntknw:
     
  16. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Если автору делать не фиг, могу подкинуть задачек, которые действительно пользу принесут и ему и обществу и интресны
     
  17. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Помнится ты ещё недавно писал дизассемблер и дизассемблировал инструкции на листочке. Ни первое, ни второе нахрен никому не надо и денег тоже не принесло. Я всё понимаю, можешь не объяснять в принципе... Эволюция, мать её.
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    EvilsInterrupt

    > это не приносит тебе денег, которые можно потратить на семью, покупку компа...

    +1000 за правильные приортеты)))) Нас так мало осталось))))
     
  19. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    W4FhLF
    Почему не принесло? Принесло, часть проектов на работе упадет в момент моего ухода,т.к. небольшая фича работает, которую наши не будут ломат - они этого бояться(хотя там и не сложно ломать). Ведь после моего увольнения, если оно будет, мы программы не обязаны работать. ;)
     
  20. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Oxaid
    Если интересно, то могу предложить одну идейку, но после оформления бумаг, по которым 25% отойдет мне - за подсказку ;)