half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
1

Занимает ли какое-либо место в памяти неинициализированный указатель?

02.06.2020, 19:09. Показов 1617. Ответов 6

Author24 — интернет-сервис помощи студентам
Добрый день! Появился вопрос: занимает ли какое-либо место в памяти неинициализированнный указатель? Для примера приведу следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    int* p;
    cout << (int) sizeof(p) << " "; // Здесь выведет 4 или 8 в зависимости от разрядности
    p = new int(5);
    cout << *p << "\n"; // Здесь выведет, естественно, 5
    delete p;
 
   return 0;
}
Вот меня интересует, занимает ли указатель p какое-либо количество памяти до применения оператора new? Понятное дело, что sizeof не показателен (возможно, ошибаюсь). Заранее спасибо за ответ.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2020, 19:09
Ответы с готовыми решениями:

Сколько памяти занимает указатель
А сколько памяти занимает указатель?И от чего это зависит?

Вводим букву, выводим ее столько раз, какое место она занимает в алфавите
Очередное задание, которое мне пока не под силу, Пользователь вводит значение Char проверить...

Какой запрос нужен, чтобы получить какое место занимает _id по рейтингу
Форумчане, нужна помощь. Есть коллекция где 2 столбца: (_id, rating). Записей более 100. Какой...

Сколько памяти занимает указатель? Ссылка?
Вот никак не могу найти ответы на эти вопросы. Указатели и ссылки эффективны в плане времени, но...

6
El. Psy. Congroo.
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
02.06.2020, 19:21 2
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
занимает ли указатель p какое-либо количество памяти
Занимает.
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
до применения оператора new?
new лишь выделяет фрагмент данных в куче и возвращает его начальный адрес.
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Понятное дело, что sizeof не показателен (возможно, ошибаюсь)
Ошибаетесь.
0
Неэпический
18093 / 10680 / 2060
Регистрация: 27.09.2012
Сообщений: 26,881
Записей в блоге: 1
02.06.2020, 19:46 3
BlackStoneBlack, это зависит от того, как ваш компилятор код построит.
sizeof действительно не показатель, по той простой причине, что он дает размер типа, и даже, если туда засунули имя объекта, он выдаст именно размер типа объекта и никакого отношения к реально занимаемой памяти это не имеет.
0
El. Psy. Congroo.
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
02.06.2020, 20:43 4
Croessmah, это так, но речь о том, сколько памяти занимает сам указатель, а не данные, расположенные по адресу, который хранится в этом самом указателе. Выделение памяти для локальных данных функции осуществляется одной единственной инструкцией, поскольку это эффективно и размер локального хранилища заранее известен.

Добавлено через 7 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
это зависит от того, как ваш компилятор код построит.
Пожалуй, это более правильно, ибо компилятор может поступить иначе, но в каком-то общем плане, память для локальных данных выделяется целиком.
0
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
02.06.2020, 21:01 5
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Вот меня интересует, занимает ли указатель p какое-либо количество памяти до применения оператора new?
Компилятор вообще может выкинуть int* p;, p = new int(5); и delete p;.
0
Неэпический
18093 / 10680 / 2060
Регистрация: 27.09.2012
Сообщений: 26,881
Записей в блоге: 1
02.06.2020, 21:15 6
Лучший ответ Сообщение было отмечено BlackStoneBlack как решение

Решение

Цитата Сообщение от Mightsoul Посмотреть сообщение
это так, но речь о том, сколько памяти занимает сам указатель
Речь о том, будет ли он занимать память. Компилятор может зарезервировать под него место, а может и нет.
Для примера возьмем код
C++
1
2
3
4
5
6
7
8
9
10
#include <cstdio>
 
int main()
{
    int* p;
    printf("%zu\n",sizeof(p));
    p = new int(5);
    printf("%d\n",*p);
    delete p; 
}
На gcc с -O3:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
.LC0:
        .string "%zu\n"
.LC1:
        .string "%d\n"
main:
        push    rbp
        mov     esi, 8
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax
        call    printf
        mov     edi, 4
        call    operator new(unsigned long)
        mov     esi, 5
        mov     edi, OFFSET FLAT:.LC1
        mov     DWORD PTR [rax], 5
        mov     rbp, rax
        xor     eax, eax
        call    printf
        mov     rdi, rbp
        mov     esi, 4
        call    operator delete(void*, unsigned long)
        xor     eax, eax
        pop     rbp
        ret
Как видим, компилятор всё проделал на регистрах. И только пятерку зачем-то записал в память.
clang же с опцией -O3 выпилил и указатель и new и delete, т.к. нафиг не нужны:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
main:                                   # @main
        push    rax
        mov     edi, offset .L.str
        mov     esi, 8
        xor     eax, eax
        call    printf
        mov     edi, offset .L.str.1
        mov     esi, 5
        xor     eax, eax
        call    printf
        xor     eax, eax
        pop     rcx
        ret
.L.str:
        .asciz  "%zu\n"
 
.L.str.1:
        .asciz  "%d\n"
Добавлено через 1 минуту
Опоздал.
0
El. Psy. Congroo.
110 / 92 / 32
Регистрация: 09.01.2018
Сообщений: 344
02.06.2020, 21:46 7
Зато ваше объяснение более доказательно.
0
02.06.2020, 21:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2020, 21:46
Помогаю со студенческими работами здесь

Какое место число занимает в существующем ряду введенных чисел, если бы они были отсортированы по возрастанию?
Суть в следующем: С клавиатуры вводится большое количество чисел (их может быть несколько десятков...

Как сделать какое-либо действие сразу после запуска программы, без нажатия чего-либо
Как сделать какое-либо действие сразу после запуска программы, без нажатия чего-либо?

Удаленный файл занимает место
Во время установки компонентов в Winetricks вылезло сообщение о нехватке места, я удивился, т. к....

Блок занимает пустое место
Здравствуйте. С помощью js добавляю к меню-шапки позиционирование fixed при скролле. Проблема в...

Россия занимает место в мире
Набрав в Google ключевые слова: &quot; Россия занимает место в мире &quot;, можно обнаружить, что Россия...

Пропала папка с раздела, место занимает
Добрый день! Жёсткий диск на 1тб. Подключаю через коробку по усб. Винда сказала, что требуется...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru