Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.74
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

[C++] Взятие адреса конструктора. Физическое время существование объекта. - C++

16.02.2012, 15:40. Просмотров 8520. Ответов 69
Метки нет (Все метки)

1. конструктор.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A
{
 
int a;
public:
A():a(555){};
~A(){}
 
};
 
int main()
{
A* pa = &A();//это вызов конструктора - явный. он используется контейнерами stl.
//вывод - конструктор можно вызвать явно и с параметрами и без.
// возвращается некий указатель на начало объекта
};
Вопрос: если объект начинается с конструктора, то полученный нами указатель - будет указывать на конструктор? и только высокоуровневые ограничения не дают нам видеть его среди членов объекта и работать с ней. Если это так, то спутившись на уровень ниже, туда где нет ограничений, по идее получив данный адрес - мы можем сделать call по этому адресу. другое дело какой эффект получится, непонятно.
поэтому обращаюсь к тебе Evg как к очень опытному специалисту знающему "нутро".
вот мы сделали бинарник. в нем программа, в ней создаются объекты классов.
мне сложно судить где буду лежать эти объекты, предположу что в .text
если мое предположение верно, то после отображения в память, можно будет обратится к конструктору зная его адрес, поскольку никакие высокоуровневые вещи не будут мешать.

вопрос 2

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class A
{
public:
    int a;
A():a(555){};
~A(){}
 
};
 
int main()
{
A* pa = &A();//это временный объект и сразу после создания будет вызван деструктор
 
int mass [1000];
 
for(int i=0;i<1000;i++)//это вызовы для мебели и зачистки останков временных объектов
    mass[i] = i;
 
 
pa->~A(); //не вызывается. объекта нет НО
int z = pa->a; //дело его живет. z ==555
 
 
return 0;
};
каково время жизни поля класса после уничтожения объекта класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2012, 15:40     [C++] Взятие адреса конструктора. Физическое время существование объекта.
Посмотрите здесь:
C++ Взятие значение из адреса
C++ Взятие адреса в аргументе
C++ Взятие адреса у константной переменной при объявлении
C++ Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит?
[Двусвязные списки] Добавление по индексу. Взятие адреса по индексу C++
Существование объекта C++
ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 20:13  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #21
Цитата Сообщение от retmas Посмотреть сообщение
адрес начала куска памяти, хранящей состояние(данные) объекта
вот первый ответ
Bers
Заблокирован
16.02.2012, 20:14     [C++] Взятие адреса конструктора. Физическое время существование объекта. #22
Цитата Сообщение от AzaKendler Посмотреть сообщение
сформулируй однозначное определение плиз.
Вот это вот недостаточно однозначное определение?
Цитата Сообщение от Bers Посмотреть сообщение
"Объект" на с++ это кусок памяти.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 20:15  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #23
Цитата Сообщение от AzaKendler Посмотреть сообщение
поля объекта лежат в секции данных. методы в секции кода. в секции данных хранятся смещения до методов в секции кода.
методы естественно на таком уроне есть функции.
получая указатель на объект класса с++ мы получаем адрес некой сигнатуры этого класса(нулевой байт) в секции данных, далее подряд идут данные этого объекта
как то так.это интересно понять
ну распиши вот так. поделись знаниями пожалуйста
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.02.2012, 20:23     [C++] Взятие адреса конструктора. Физическое время существование объекта. #24
Цитата Сообщение от AzaKendler Посмотреть сообщение
получая указатель на объект класса с++ мы получаем адрес некой сигнатуры (нулевой байт) этого класса в секции данных
речь идет о статических объектах? или о любых?
память, выделенная из кучи под объект, или создание объекта на стеке не в счет?
AzaKendler, что-то я не очень понимаю, что вы хотите выяснить?
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 20:29  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #25
retmas, речь идет об объекте класса на стеке и взятия его адреса.
о том что собой будет представлять этот объект в бинарном файле и в итоге в памяти после загрузки бинарника. о том что если мы получаем указатель на нулевой байт объекта, то это видимо указатель на секцию с данными в которой должна еще содержаться информация о смещениях на "методы" в секции кода. все это в итоге приведет нас к тому что мы двигаясь по секции с данными можем найти смещение на конструктор. подтвердите или опровергните пожалуйтса

Добавлено через 1 минуту
Цитата Сообщение от retmas Посмотреть сообщение
что вы хотите выяснить?
точное представление высокоуровневых объектов с++ - таких как экземпляры объектов класса, на уровне бинарного файла.
Bers
Заблокирован
16.02.2012, 20:30     [C++] Взятие адреса конструктора. Физическое время существование объекта. #26
Цитата Сообщение от AzaKendler Посмотреть сообщение
ну распиши вот так. поделись знаниями пожалуйста
Пожалуйста:

В секции данных лежат указивки загрузчику файла, чем заполнить статическую область памяти программы перед её запуском.

Есть ещё секция кода - там боевой код программы, и ещё всякие разные секции, с которыми ты можешь ознакомится мало мало погуглив, например "формат PE"

Получая адрес объекта, ты получаешь адрес ячейки памяти, с которой начинаются данные этого объекта.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.02.2012, 20:32     [C++] Взятие адреса конструктора. Физическое время существование объекта. #27
Цитата Сообщение от AzaKendler Посмотреть сообщение
речь идет об объекте класса на стеке и взятия его адреса.
Цитата Сообщение от AzaKendler Посмотреть сообщение
получаем указатель на нулевой байт объекта, то это видимо указатель на секцию с данными
противоречий не видите?
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 20:35  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #28
Bers, ладно. я читал про пе, потому и появились вопросы. думал ты как чел с большой практикой расскажешь. но тебе скорее всего это просто неинтересно.
тогда и прикрыть можно тему эту.

Добавлено через 23 секунды
Цитата Сообщение от retmas Посмотреть сообщение
противоречий не видите?
в чем они аа. щас поясню

Добавлено через 1 минуту
Цитата Сообщение от retmas Посмотреть сообщение
Сообщение от AzaKendler
речь идет об объекте класса на стеке и взятия его адреса.
Сообщение от AzaKendler
и представлении его в бинарном файле. в PE


______________
спасибо всем за потраченное время и ответы
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.02.2012, 20:52     [C++] Взятие адреса конструктора. Физическое время существование объекта. #29
Цитата Сообщение от AzaKendler Посмотреть сообщение
должна еще содержаться информация о смещениях на "методы" в секции кода
Да не должна в объектах информация о методах содержаться. Вот вызываем мы функцию foo с одним аргументом типа int. Что, по-вашему, там, где хранится значение этой переменной типа int, ещё и адрес foo должен лежать? Нет, конечно. Так вот объект класса - это, по сути такая же переменная некоторого типа (вернее, голые байты в некотором количестве). Вызов метода компилятором разворачивается в такой же вызов функции, как вызов foo. Никаких смещений. Объект ничего не знает о своих методах (просто никаких методов и объектов уже нет, компилятор помещает в стек некоторый набор данных (ранее объект) и передаёт управление некоторому адресу в памяти (ранее методу)).
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 21:10  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #30
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вот вызываем мы функцию foo с одним аргументом типа int.
ты перевернул. в функцию аргумент из стека придет.

а вот вызываем мы метод класса - это слегка другой процесс не находишь?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.02.2012, 21:14     [C++] Взятие адреса конструктора. Физическое время существование объекта. #31
AzaKendler, не-а, не нахожу. Вызов a.foo() разворачивается в foo(&a). this и есть тот указатель (являющийся неявным параметром любого нестатического метода класса), который содержит адрес вызывающего объекта.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
16.02.2012, 21:14     [C++] Взятие адреса конструктора. Физическое время существование объекта. #32
AzaKendler, уж не раз отсылал тебя к своей статье, почему-то не хочешь читать, хотя все ответы на твои вопросы там есть

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class A
{
  public:
    int a;
 
    A() : a(555) {}
    ~A() {}
};
 
int main()
{
  A* pa = &A();
}
эквивалентно

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* Вот так выглядит экземпляр класса в памяти */
struct A
{
  int a;
};
 
/* Конструктор */
void A_constr (struct A *this)
{
  this->a = 555;
}
 
/* Деструктор */
void A_destr (struct A *this)
{
}
 
int main (void)
{
  /* Эти две строки есть эквивалент кода "A()" */
  tmp_A;
  A_constr (&tmp_A);
 
  /* А эта строка в совокупности с двумя предыдущими есть
   * эквивалент кода "A *pa = &A();" */
  A *pa = &tmp_A;
}
Указатель pa смотрит на фрагмент стека, куда компилятор распределил временный объект. От этого куска стека ты никак не можешь попасть до того реального места, где у тебя лежит процедура, соответствующая конструктору.

Если теперь откомпилировать программу на Си++ и посмотреть на код:

Код
$ g++ t.cc -c
t.cc: In function 'int main()':
t.cc:12: warning: taking address of temporary
Код
$ readelf --symbols t.o

Symbol table '.symtab' contains 16 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
...
    12: 00000000    14 FUNC    WEAK   DEFAULT    7 _ZN1AC1Ev
...
    14: 00000000     5 FUNC    WEAK   DEFAULT    8 _ZN1AD1Ev
    15: 00000000    48 FUNC    GLOBAL DEFAULT    3 main
Функция _ZN1AC1Ev соответствует конструктору, функция _ZN1AD1Ev - деструктору. Чтобы такие кривые (манглированные) имена переводить в божеский вид, можно воспользоватся утилитой c++filt:

Код
$ c++filt _ZN1AC1Ev
A::A()
$ c++filt _ZN1AD1Ev
A::~A()
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 21:52  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #33
Указатель pa смотрит на фрагмент стека, куда компилятор распределил временный объект. От этого куска стека ты никак не можешь попасть до того реального места, где у тебя лежит процедура, соответствующая конструктору.


хорошо. видимо пример не очень. давай возьмем объект с временем жизни подольше

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct A
{
 void test(){int a =56;int b =4; int c =a+b;}
}
 
int main()
{
A a;
A* pa = &a;//указывает на секцию с данными на начало "a",верно?
pa->test();  //вызов возможен.
pa->~A; //тоже
 
}
где же лежит конструктор? в "особом" месте?
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
16.02.2012, 22:02     [C++] Взятие адреса конструктора. Физическое время существование объекта. #34
Ау!! Ты вообще читаешь, что тебе пишут? Конструктор с точки зрения кода это САМАЯ ОБЫЧНАЯ ФУНКЦИЯ.

Цитата Сообщение от AzaKendler Посмотреть сообщение
а из этого места я могу попасть туда где лежат другие процедуры и деструктор например?
Создай локал "int x;" в функции main, возьми на "x" адрес. Как из "этого места" ты можешь "попасть туда, где лежат другие функции (например, func)". Очевидно, что никак

Цитата Сообщение от AzaKendler Посмотреть сообщение
что это означает? конструктор что лежит в "особом" месте?
Ещё раз. Конструктор - это ОБЫЧНАЯ ФУНКЦИЯ и лежит она там, где лежат все остальные функции

Цитата Сообщение от AzaKendler Посмотреть сообщение
где же лежит конструктор? в "особом" месте?
См. выше
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 22:05  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #35
Evg, ну это понятно. тогда его вызов извне ограничен только в контексте языка с++ и концепции классов я прав?
и теоретически мы можем вызвать конструктор, поскольку он является обычной функцией найдя его адрес в загруженном в память файле. верно? я имею ввиду следующее - загрузили файл, нашли адрес его модуля, допустим мы знаем смещение до такой функции как конструктор и найдя ее адрес в памяти обращаемся к ней минуя высокоуровневые конструкции
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
16.02.2012, 22:11     [C++] Взятие адреса конструктора. Физическое время существование объекта. #36
Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, ну это понятно. тогда его вызов извне ограничен только в контексте языка с++ и концепции классов я прав?
Именно так. Точно так же ты можешь "вызвать" переменную. Правда засада может быть в том, что переменные складываются в страницы памяти, в которых операционная системе не разрешает исполнять код, но это всё рулится (под линуксом через mprotect)

C
1
2
3
4
5
6
7
8
/* Тут как бы рисуем код */
char c[] = { 0x11, 0x22, 0x33, .... }
 
int main (void)
{
  mprotect ( /* лень разбираться, что конкретно тут подавть надо */); */
  ((void(*)(void)) &c)();
}
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 22:14  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #37
Evg, спасибо. и последний вопрос.
Bers
Заблокирован
16.02.2012, 22:17     [C++] Взятие адреса конструктора. Физическое время существование объекта. #38
Evg, как на с++ можно заполучить адрес конструктора, и запустить его по "указателю" ?
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,672
Записей в блоге: 26
16.02.2012, 22:21     [C++] Взятие адреса конструктора. Физическое время существование объекта. #39
Цитата Сообщение от Bers Посмотреть сообщение
Evg, как на с++ можно заполучить адрес конструктора, и запустить его по "указателю" ?
Я плохо разбираюсь в Си++, но, насколько знаю, адрес конструктора средствами языка взять нельзя
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2012, 22:25     [C++] Взятие адреса конструктора. Физическое время существование объекта.
Еще ссылки по теме:
Почему лучше инициализировать объекты класса во время инициализации конструктора? C++
C++ Реализовать динамический массив объектов, учитывая, что параметры для конструктора у каждого объекта разные
Используйте объект orange типа Tfruit для инициализации объекта grapefruit с помощью конструктора копирования C++
Получение адреса объекта после обнуления указателя на этот объект C++
C++ В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.02.2012, 22:25  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #40
Цитата Сообщение от Evg Посмотреть сообщение
адрес конструктора средствами языка взять нельзя
из текущего модуля в котором и пишется класс. а из загруженного файла функциями api все что угодно. надо только понять где конструктор в образе файла. и тогда получится вызов констуктора как простой функции из языка с++, средствами с++, но...не в том файле в котором писался искомый класс
Yandex
Объявления
16.02.2012, 22:25     [C++] Взятие адреса конструктора. Физическое время существование объекта.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru