Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> класс, расположение атрибутов в памяти 
:(
    Опции темы
azesmcar
Дата 2.7.2009, 11:19 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  2.7.2009,  10:53 Найти цитируемый пост)

какое выравнивание? какой указатель на ВМТ?
там будет 

mov eax, someStruct
mov eax, [eax+Struct.x]

где Struct.x  - смещение нужного поля, например 0x3C


а смещение тебе наверное компилятор в комментариях сгенерированного бинарного кода напишет, так? Окуда ты это магическое число взял?
Тебя не должно волновать то, что тип который должен занимать 1 байт, занимает 4 к примеру? Оффсеты как считать будешь? А то что вместо объекта в памяти лежит указатель на него (речь о виртуальном базовом классе) тебя тоже не волнует? Или то что по указателю объекта mystruct

Код

struct mystruct
{
   int q;
   int v;
   char c;
   virtual ~mystruct() {};
}

лежит не int q, а указатель на vtable. Это все конечно не важно, ведь у нас есть магическое число 0x3C, которое решает все проблемы.
PM   Вверх
GoldFinch
Дата 2.7.2009, 11:28 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



azesmcar, ты тоже не знаешь о чем говориш.
PM MAIL ICQ   Вверх
azesmcar
Дата 2.7.2009, 11:30 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  2.7.2009,  11:28 Найти цитируемый пост)
azesmcar, ты тоже не знаешь о чем говориш. 

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


Это сообщение отредактировал(а) azesmcar - 2.7.2009, 11:31
PM   Вверх
Lazin
Дата 2.7.2009, 11:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(GoldFinch @  1.7.2009,  21:17 Найти цитируемый пост)
Да, для полиморфных объектов можно просканировать всю память, ища указатель на таблицу виртуальных методов (ВМТ) класса, который будет в начале искомого объекта, но это неоптимально.


Цитата(GoldFinch @  2.7.2009,  10:53 Найти цитируемый пост)
какое выравнивание? какой указатель на ВМТ?


то о котором ты говорил smile 
PM MAIL Skype GTalk   Вверх
jonie
Дата 2.7.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



а есть еще оптимизация,  и там можгут быть совввсем другие выкрутасы с vtable  в том числе.  Тем более что с vtable все тоже сложно (пример: http://www.rsdn.ru/article/cpp/fastdelegate.xml)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GoldFinch
Дата 2.7.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



azesmcar, берем прогу
Код

#include <iostream>

class Foo
{
public:
    virtual void print() = 0;
    virtual ~Foo() {};
};

class Foo1 : public Foo
{
public:
    Foo1(int x);
    void print();
    ~Foo1();
private:
    int* x_;
};

Foo1::Foo1(int x):x_(new int(x)){}
void Foo1::print() {std::cout<<"x="<<*x_<<std::endl;}
Foo1::~Foo1() {delete x_;}

void test(Foo* foo)
{
    foo->print();
}

int main()
{
    int x;
    std::cin>>x;

    Foo* foo=new Foo1(x);
    test(foo);
    delete foo;

    return 0;
}

компилим в релизе без отладочной информации
грузим в IDA, ищем "x=", находим Foo1::print()
в начале которого видим
Код

Foo1__print proc near
push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF8h
mov     eax, [ecx+4]  ; eax=x_ (ecx == this) 
mov     ecx, [eax]  ; ecx=*x_
push    esi
push    edi
push    ecx
push    ecx
call    sub_406900 ; some_crt_print(ecx)
add     esp, 4 ;1 argument

откуда мы получаем что смещение x_ равно 0x4
и можем восстановить код
Код

struct Foo1
{
char stuff[4];
int* x;
}

PM MAIL ICQ   Вверх
Lazin
Дата 2.7.2009, 12:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



поздравляю, ты нашел указатель на VMT!
осталось сделать чуть менее тривиальный пример, что-бы посмотреть как выравниваются члены класса в памяти smile 

Цитата(azesmcar @  2.7.2009,  11:19 Найти цитируемый пост)
Окуда ты это магическое число взял?
Тебя не должно волновать то, что тип который должен занимать 1 байт, занимает 4 к примеру? Оффсеты как считать будешь?

из дизассемблированого кода вестимо, видимо к этому ответу относился комментарий:
Цитата(GoldFinch @  2.7.2009,  11:28 Найти цитируемый пост)
azesmcar, ты тоже не знаешь о чем говориш
 xD ты забыл мягкий знак!

PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 2.7.2009, 13:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Lazin, при реверсировании мне совершенно без разницы, выравнивание там, или просто поле которое не используется
в обоих случаях я пишу "char stuff_xx[delta];" 
если я не собираюсь пользоваться указателем на вмт - он stuff, если собираюсь, он int*, то же можно сказать и о других полях

Это сообщение отредактировал(а) GoldFinch - 2.7.2009, 13:35
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1270 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.