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

C++

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

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

16.02.2012, 15:40. Просмотров 8379. Ответов 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++ Взятие адреса в аргументе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6483 / 4949 / 455
Регистрация: 14.02.2011
Сообщений: 16,395
18.02.2012, 19:06     [C++] Взятие адреса конструктора. Физическое время существование объекта. #61
чей то файл не прикрепился посылаю еше раз
Вложения
Тип файла: rar tstOptimise.rar (3.2 Кб, 11 просмотров)
Evg
Эксперт CАвтор FAQ
17301 / 5549 / 347
Регистрация: 30.03.2009
Сообщений: 15,104
Записей в блоге: 26
24.02.2012, 12:07     [C++] Взятие адреса конструктора. Физическое время существование объекта. #62
Вот пример на логическое время жизни:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int x = 1;
 
int main (void)
{
  /* В данной точке __локальная__ переменная "x" логически ещё не существует
   * (хотя компилятор память под неё уже выделил). Поэтому в данной точке
   * в качестве "x" подставится __глобальная__ переменная */
  int a = x;
 
  int x = 2;
 
  /* А в этой точке __локальная__ переменная "x" уже существует, и подставится
   * именно она */
  int b = x;
 
  printf ("a=%d, b=%d\n", a, b);
 
  return 0;
}
Код
$ gcc t.c
$ ./a.out
a=1, b=2
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:11  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #63
интерeсно

Добавлено через 1 минуту
Evg, т.е. "логическая" жизнь переменной по твоему начинается с ее объявления в стэке?
и глобальные объекты не имеют "логической жизни"?

C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
int z;
};
A a; //типа он логически не жилец?
int main ()
{
a.z = 5;
 
return 0;}

логическая жизнь - это возможность обратится к некой области памяти по некому "псевдониму" в программе. в данном случае по имени переменной.
Я правильно сформулировал?
Напиши плиз свою версию.
Evg
Эксперт CАвтор FAQ
17301 / 5549 / 347
Регистрация: 30.03.2009
Сообщений: 15,104
Записей в блоге: 26
24.02.2012, 16:17     [C++] Взятие адреса конструктора. Физическое время существование объекта. #64
Цитата Сообщение от AzaKendler Посмотреть сообщение
Evg, т.е. "логическая" жизнь переменной по твоему начинается с ее объявления в стэке?
Не "по моему", а "по стандарту". И не с объявления в стеке, а с написания в исходнике.

Цитата Сообщение от AzaKendler Посмотреть сообщение
и глобальные объекты не имеют "логической жизни"?
У них время жизни "вся программа". Т.е. от начала исполнения main и до завершения работы программы

Цитата Сообщение от AzaKendler Посмотреть сообщение
логическая жизнь - это возможность обратится к некой области памяти по некому "псевдониму" в программе
Логическая жизнь - это то, что гарантирует стандарт. Что начиная с этой точки к переменной можно обращаться. Будь то с точки зрения языка (т.е. по имени), будь то с точки зрения исполняемого кода. Т.е. если до объявления локала ты воткнёшь ассемблерную вставку, которая будетработать с памятью, которую компилятор отвёл под локал, и если этот код не будет работать должным образом - то сам дурак, потому что компилятор (а точнее, стандарт) будет тебе гарантировать корректную работу с переменной только начиная с точки её объявления в исходнике.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:23  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #65
Секция .data

Как по умолчанию программный код попадает в секцию .text, так и инициализированные данные попадают в секцию .data. Инициализированные данные состоят из тех глобальных и статических переменных, которые были проинициализированы во время компиляции. Они также включают строковые литералы (например, строку "Hello World" в программе C/C++). Компоновщик объединяет все секции .data из разных объектных и LIB-файлов в одну секцию .data в ЕХЕ-файле. Локальные переменные расположены в стеке цепочки и не занимают места в секциях .data и .bss.
абстрактная цитата

те переменные которые ты привел в примере они располагаются в разных точках просто.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
Что начиная с этой точки к переменной можно обращаться.
в твоем примере к глобальной х можно обращаться. в моем к а тоже.
что не так с логической жизнью у них? поясни

Добавлено через 2 минуты
Цитата Сообщение от Evg Посмотреть сообщение
/* В данной точке локальная переменная "x" логически ещё не существует
* ** (хотя компилятор память под неё уже выделил). *
*
}
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
24.02.2012, 16:44     [C++] Взятие адреса конструктора. Физическое время существование объекта. #66
Цитата Сообщение от AzaKendler Посмотреть сообщение
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
Попробуйте.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:52  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #67
невнимательно читал. речь шла о локальной переменной.
silent_1991
Эксперт С++
4952 / 3028 / 149
Регистрация: 11.11.2009
Сообщений: 7,026
Завершенные тесты: 1
24.02.2012, 16:54     [C++] Взятие адреса конструктора. Физическое время существование объекта. #68
AzaKendler, пример Evg был о другом. Глобальная переменная там была только для того, чтобы показать, что логически в коде "до" объявления локальной переменной её не существует, а существует глобальная, к которой и будет обращение. Вот минимальный код, который показывает то же, но тут не получится запутаться в локальных/глобальных именах.
C++
1
2
3
4
5
int main()
{
    x = 10;
    int x;
}
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
24.02.2012, 16:57  [ТС]     [C++] Взятие адреса конструктора. Физическое время существование объекта. #69
Цитата Сообщение от AzaKendler Посмотреть сообщение
?? т.е. к ней нельзя обратится по имени в этой точке по твоему?
все верно. спутал с глобальной. невнимательно читал

Добавлено через 28 секунд
silent_1991, да я уже понял. слово локальная в его фразе как то "пропустил"

смешно получилось
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2012, 17:00     [C++] Взятие адреса конструктора. Физическое время существование объекта.
Еще ссылки по теме:

C++ Зачем взятие адреса нулевого элемента массива, если сама переменная и так его содержит?
Получение адреса объекта после обнуления указателя на этот объект C++
C++ В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?
Используйте объект orange типа Tfruit для инициализации объекта grapefruit с помощью конструктора копирования C++
C++ Взятие значение из адреса

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17301 / 5549 / 347
Регистрация: 30.03.2009
Сообщений: 15,104
Записей в блоге: 26
24.02.2012, 17:00     [C++] Взятие адреса конструктора. Физическое время существование объекта. #70
Да, глобальная переменная была только для того, чтобы показать, что в первой точке локальной переменной x ещё не существует (в подверждение этого обращаясь к x, мы попадём именно к глобальной переменной). Это было сделано для того, чтобы получить пример, который компилируется и исполняется. Коротенький пример от silent_1991 показывает ровно то же самое, но в качестве подтверждения выступает ошибка компиляции
Yandex
Объявления
24.02.2012, 17:00     [C++] Взятие адреса конструктора. Физическое время существование объекта.
Ответ Создать тему
Опции темы

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