Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
Заблокирован
1

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

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

Привет!
Вы не подскажите, где в памяти храниться тип указателя?
Ну допустим, у нас x86 и указатель занимает 4 байта, но эти 4-е байта - это ж просто адрес, а где хранится сам тип? Ведь есть же тип указателя, ну не всё же void*, есть же int*, bool*, double*, MyClass* и т.д.
Я даже знаю, что есть информация о размере блока, на который указывает указатель как бы, он с каким - то смещением рядом лежит, но это конечно же компилятор - депендет, так что везде по разному, ну да не суть, а вот сам тип где храниться и сколько байтов занимает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.08.2014, 06:10
Ответы с готовыми решениями:

Где хранится размер памяти, которая выделена указателю?
Поясню вопрос. Когда выделяем память указателю, то указываем размер: float *ptrarray = new...

Boost.Program_options - где хранится тип параметра?
Добрый день. Подскажите, пожалуста, можно ли узнать тип параметра в Boost.Program_options во время...

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

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

8
190 / 89 / 33
Регистрация: 04.11.2013
Сообщений: 469
Записей в блоге: 4
24.08.2014, 09:56 2
М.б. он не хранит тип указателя для времени исполнения, так как адреса однотипны? Зачем знать тип указателя во время исполнения? 4 байта занимает адрес, тип не хранится.
0
Ушел с форума
Эксперт С++
16406 / 7381 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
24.08.2014, 10:27 3
Лучший ответ Сообщение было отмечено -NEURON- как решение

Решение

Цитата Сообщение от -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
Заблокирован
24.08.2014, 11:27  [ТС] 4
Цитата Сообщение от Убежденный Посмотреть сообщение
Нигде не хранится.
Что значит ни где ? Если я объявляю int* a, значит у этого А где - то храниться тип ? Или я не прав
0
Ушел с форума
Эксперт С++
16406 / 7381 / 1184
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
24.08.2014, 12:06 5
Лучший ответ Сообщение было отмечено taras atavin как решение

Решение

Цитата Сообщение от -NEURON- Посмотреть сообщение
Если я объявляю int* a, значит у этого А где - то храниться тип ?
Нет.
В C++ типы - это термин, которым оперирует компилятор на этапе компиляции.
В машинном коде, полученном после компиляции, уже никаких типов нет.
Так устроен язык, чтобы не тащить лишних сущностей, потому что динамическое
хранение и динамические проверки типов - это накладные расходы, за которые
далеко не всегда программист готов платить процессорным временем и памятью.
1
4196 / 1789 / 211
Регистрация: 24.11.2009
Сообщений: 27,563
24.08.2014, 12:27 6
А зачем указателю хранить свой тип? На этапе компиляции идентификатор указателя известен, а он декларирован определённым типом, значит операции с нем уже транслированы этим типом. Ладно ещё динамические экземпляры полиморфных типов, им надо явно хранить информацию о типах. Но при чём здесь указатели? Вот скажите, автомобиль "волга" свой чертёж с собой возит? Или проект столба прибит к каждому дорожному указателю аля "Нижние Васюки через 50 км"?
1
Эксперт С++
4964 / 3070 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
24.08.2014, 13:51 7
Тип хранит компилятор.
1
Evg
Эксперт CАвтор FAQ
21130 / 8146 / 628
Регистрация: 30.03.2009
Сообщений: 22,459
Записей в блоге: 30
24.08.2014, 15:11 8
Лучший ответ Сообщение было отмечено taras atavin как решение

Решение

Цитата Сообщение от -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
Заблокирован
25.08.2014, 11:26  [ТС] 9
Evg, спасибо за развёрнутый ответ, теперь всё ясно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2014, 11:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Char*str = "Hello, world"; Указатель, указывающий на эту строку, хранится в стэке, а где хранится сама строка?
нужно ли освобождать память, выделенную под str?

Узнать тип значения, зная тип указателя
Здравствуйте! Есть такой код: template&lt;class Iter&gt; void func(Iter first, Iter last) { ...

Реализовать внешнюю функцию с именем make _ тип (), где тип — тип реализуемой структуры
Реализовать внешнюю функцию с именем make _ тип (), где тип — тип реализуемой структуры. Функция...

Как хранится структура C++ в памяти?
Всем привет! Набросал небольшой тест (mingw): #include &lt;iostream&gt; #include &lt;conio.h&gt; //getch ...


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

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

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