Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
-NEURON-
Заблокирован
#1

Где в памяти хранится тип указателя? - C++

24.08.2014, 06:10. Просмотров 516. Ответов 8
Метки нет (Все метки)

Привет!
Вы не подскажите, где в памяти храниться тип указателя?
Ну допустим, у нас x86 и указатель занимает 4 байта, но эти 4-е байта - это ж просто адрес, а где хранится сам тип? Ведь есть же тип указателя, ну не всё же void*, есть же int*, bool*, double*, MyClass* и т.д.
Я даже знаю, что есть информация о размере блока, на который указывает указатель как бы, он с каким - то смещением рядом лежит, но это конечно же компилятор - депендет, так что везде по разному, ну да не суть, а вот сам тип где храниться и сколько байтов занимает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2014, 06:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где в памяти хранится тип указателя? (C++):

Можно ли получить адрес памяти где хранится буква "a" - C++
Всем привет! Пожалуйста объясните этот код ) char string = "abcdef"; cout << string; // будет вывод abcdef cout << *string; //...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Узнать тип значения, зная тип указателя - C++
Здравствуйте! Есть такой код: template<class Iter> void func(Iter first, Iter last) { //... Iter_value_type = *first;...

Где что хранится - C++
Интересно, а вот такие объекты: int const a(5); char const * str("Hello world"); как константы, строковые литералы, они где...

Что определяет тип указателя - C++
Наткнулся на ответ: Что определяет тип указателя? Размер смещения при инкременте указателя Не понял что-то. int* a; ...

Где хранится созданный файл ? - C++
Доброго времени суток! Хочу задать дилетантский вопрос. ifstream infile("fdata.txt"); Где сохраняется созданный файл...

8
Alexandr_1982
177 / 75 / 17
Регистрация: 04.11.2013
Сообщений: 383
Записей в блоге: 4
24.08.2014, 09:56 #2
М.б. он не хранит тип указателя для времени исполнения, так как адреса однотипны? Зачем знать тип указателя во время исполнения? 4 байта занимает адрес, тип не хранится.
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
24.08.2014, 10:27 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -NEURON- Посмотреть сообщение
где в памяти храниться тип указателя?
Нигде не хранится.
В C++ используется статическая типизация, т.е. типы данных фигурируют
только на этапе компиляции программы (RTTI пока не рассматриваем).
Не имея правильный тип, многие вещи в C++ не будут работать корректно.
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
struct example
{
    example()  { cout << "Creating" << endl; }
    ~example() { cout << "Deleting" << endl; }
};
 
int main()
{
    example * p = new example();
    delete (int *)p;
    return 0;
}
Здесь поведение "delete (int *)p" не определено, так как типы не совпадают.
Скорее всего, при запуске этого кода на большинстве компиляторов
деструктор example не будет вызван (хотя не исключена другая,
более "страшная" реакция времени исполнения).
1
-NEURON-
Заблокирован
24.08.2014, 11:27  [ТС] #4
Цитата Сообщение от Убежденный Посмотреть сообщение
Нигде не хранится.
Что значит ни где ? Если я объявляю int* a, значит у этого А где - то храниться тип ? Или я не прав
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
24.08.2014, 12:06 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -NEURON- Посмотреть сообщение
Если я объявляю int* a, значит у этого А где - то храниться тип ?
Нет.
В C++ типы - это термин, которым оперирует компилятор на этапе компиляции.
В машинном коде, полученном после компиляции, уже никаких типов нет.
Так устроен язык, чтобы не тащить лишних сущностей, потому что динамическое
хранение и динамические проверки типов - это накладные расходы, за которые
далеко не всегда программист готов платить процессорным временем и памятью.
1
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
24.08.2014, 12:27 #6
А зачем указателю хранить свой тип? На этапе компиляции идентификатор указателя известен, а он декларирован определённым типом, значит операции с нем уже транслированы этим типом. Ладно ещё динамические экземпляры полиморфных типов, им надо явно хранить информацию о типах. Но при чём здесь указатели? Вот скажите, автомобиль "волга" свой чертёж с собой возит? Или проект столба прибит к каждому дорожному указателю аля "Нижние Васюки через 50 км"?
1
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
24.08.2014, 13:51 #7
Тип хранит компилятор.
1
Evg
Эксперт CАвтор FAQ
18368 / 6415 / 441
Регистрация: 30.03.2009
Сообщений: 17,795
Записей в блоге: 28
24.08.2014, 15:11 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -NEURON- Посмотреть сообщение
Если я объявляю int* a, значит у этого А где - то храниться тип ?
Тип хранится в компиляторе на этапе компиляции. В коде в явном виде тип не существуют, тип преобразуется в некоторые числовые константы типа "размер типа", "смещение поля" или машинные операции, работающие над разными типами данных

Т.е. если на языке было написано

C
int *p;
p++;
то в коде ты увидишь, что берётся некоторый регистр (на котором лежит переменная-указатель 'p'), и к этому регистру прибавляется значение 4 (что соответствует размеру типа int). Ровно такой же код ты получишь, если p является указателем на unsigned int или float, поскольку эти типы так же имеют размер 4

C
struct s
{
  int a, b, c, d;
};
 
struct s *p;
 
p->c = 0;
здесь ты в коде увидишь, что берётся регистр с указателем, к нему прибавляется 8 (смещение поля 'c' в структуре 's') и в полученный адрес записывается 0.

C
1
2
3
4
int a, b;
float c, d;
a = a + b;
c = c + d;
в полученном коде ты увидишь две различные операции - целочисленного сложения и плавающего сложения.

Глядя на код обычно можно догадаться о типах данных в исходнике. Но только в результате размышлений. Напрямую в коде никакой информации о типах нет
1
-NEURON-
Заблокирован
25.08.2014, 11:26  [ТС] #9
Evg, спасибо за развёрнутый ответ, теперь всё ясно.
0
25.08.2014, 11:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 11:26
Привет! Вот еще темы с ответами:

Выражение должно иметь тип указателя - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; struct laiks { int h; int m; int s; ...

Как поменять тип данных у указателя? - C++
Здравствуйте, уже часа 3 маюсь, все никак не могу поменять тип данных... это надо для отправки по сокету.. Значит по сокету у меня...

Как изменить тип указателя массива ? - C++
Например создаю массив: void * mass; if(1 == 1) mass = wchar_t; else mass = char; Пример конечно ппц какой бред, но если...

Выражение должно иметь тип указателя на объект - C++
Не могу понять где я ошибся, на j ругается. // lalaba3.cpp: определяет точку входа для консольного приложения. // #include...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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