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

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

Восстановить пароль Регистрация
 
-NEURON-
Заблокирован
24.08.2014, 06:10     Где в памяти хранится тип указателя? #1
Привет!
Вы не подскажите, где в памяти храниться тип указателя?
Ну допустим, у нас x86 и указатель занимает 4 байта, но эти 4-е байта - это ж просто адрес, а где хранится сам тип? Ведь есть же тип указателя, ну не всё же void*, есть же int*, bool*, double*, MyClass* и т.д.
Я даже знаю, что есть информация о размере блока, на который указывает указатель как бы, он с каким - то смещением рядом лежит, но это конечно же компилятор - депендет, так что везде по разному, ну да не суть, а вот сам тип где храниться и сколько байтов занимает?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alexandr_1982
Нарушитель
175 / 71 / 17
Регистрация: 04.11.2013
Сообщений: 383
Записей в блоге: 4
24.08.2014, 09:56     Где в памяти хранится тип указателя? #2
М.б. он не хранит тип указателя для времени исполнения, так как адреса однотипны? Зачем знать тип указателя во время исполнения? 4 байта занимает адрес, тип не хранится.
Убежденный
Системный программист
 Аватар для Убежденный
14197 / 6212 / 985
Регистрация: 02.05.2013
Сообщений: 10,348
Завершенные тесты: 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 не будет вызван (хотя не исключена другая,
более "страшная" реакция времени исполнения).
-NEURON-
Заблокирован
24.08.2014, 11:27  [ТС]     Где в памяти хранится тип указателя? #4
Цитата Сообщение от Убежденный Посмотреть сообщение
Нигде не хранится.
Что значит ни где ? Если я объявляю int* a, значит у этого А где - то храниться тип ? Или я не прав
Убежденный
Системный программист
 Аватар для Убежденный
14197 / 6212 / 985
Регистрация: 02.05.2013
Сообщений: 10,348
Завершенные тесты: 1
24.08.2014, 12:06     Где в памяти хранится тип указателя? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от -NEURON- Посмотреть сообщение
Если я объявляю int* a, значит у этого А где - то храниться тип ?
Нет.
В C++ типы - это термин, которым оперирует компилятор на этапе компиляции.
В машинном коде, полученном после компиляции, уже никаких типов нет.
Так устроен язык, чтобы не тащить лишних сущностей, потому что динамическое
хранение и динамические проверки типов - это накладные расходы, за которые
далеко не всегда программист готов платить процессорным временем и памятью.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.08.2014, 12:27     Где в памяти хранится тип указателя? #6
А зачем указателю хранить свой тип? На этапе компиляции идентификатор указателя известен, а он декларирован определённым типом, значит операции с нем уже транслированы этим типом. Ладно ещё динамические экземпляры полиморфных типов, им надо явно хранить информацию о типах. Но при чём здесь указатели? Вот скажите, автомобиль "волга" свой чертёж с собой возит? Или проект столба прибит к каждому дорожному указателю аля "Нижние Васюки через 50 км"?
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,017
Записей в блоге: 10
Завершенные тесты: 1
24.08.2014, 13:51     Где в памяти хранится тип указателя? #7
Тип хранит компилятор.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16827 / 5248 / 321
Регистрация: 30.03.2009
Сообщений: 14,129
Записей в блоге: 26
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;
в полученном коде ты увидишь две различные операции - целочисленного сложения и плавающего сложения.

Глядя на код обычно можно догадаться о типах данных в исходнике. Но только в результате размышлений. Напрямую в коде никакой информации о типах нет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2014, 11:26     Где в памяти хранится тип указателя?
Еще ссылки по теме:

Узнать тип значения, зная тип указателя C++
C++ Можно ли получить адрес памяти где хранится буква "a"
Передача указателя на массив тип complex в функцию C++

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

Или воспользуйтесь поиском по форуму:
-NEURON-
Заблокирован
25.08.2014, 11:26  [ТС]     Где в памяти хранится тип указателя? #9
Evg, спасибо за развёрнутый ответ, теперь всё ясно.
Yandex
Объявления
25.08.2014, 11:26     Где в памяти хранится тип указателя?
Ответ Создать тему
Опции темы

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