0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
1

Стандартные типы объектов в C++ и выделение памяти под них

19.04.2013, 10:27. Показов 754. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здрасти
У меня вот такой вопрос , а точнее даже вопросы ...
допустим есть код :
C++
1
char *string = "ABC";
В данном случае , у нас создается объект типа указатель , принимающий массив символов ...
То есть , по идее будет выделен , следующий объем памяти :
Размер указателя (В MSVC 2010 - 4 байта) + размер внутренностей , этого указателя , то есть 4 Байта(char(1 символ) = 1 байт) .... Что в сумме дает ... 8 байт ....Так ли это :?
Итак идем далее , и следующий вопрос ....
Начнем сразу с кода ....:
C++
1
char string[] = "ABC";
В данном случае уже , непосредственно создается объект типа char ... Никих указателей .. А значит по идее , будет выделено 4 Байта памяти , так ли это :?(Ведь по идее указатель то есть , но он вроде б как не создан...)
Идем еще ниже ....Код :
C++
1
void *vString = "ABC" ;
Тут создаеться указатель .... И что то кладется внутрь(это что то - типа STRING) .. Однако , каков будет объем внутренностей :? И памяти выделенной в целом :?
И последний вопрос ...
Допустим я хочу , написать класс , для работы с длинной арифметикой - быть может , с чилсами , содержищими более 1000 разрядов ....Как это сделать , я знаю , и дажее более того - много разных способов ... Но вопрос , не в этом , а втом как выгодней хранить исходное число ...
Может в виде указателя на массив символов (но если я был прав выше , то по идее будет выделено 1000+ байт , в то время как , если бы я создал массив интов , и каждый инт бы хранил 9 цифр ( т.е массив вышел бы из примерно 100 интов) - то вышло бы 400 байт), если кто то думает что при сложении у меня возникли бы проблемы , то тут она решаеться в лучшую сторону , с помощью Вставки ассемблерного кода , а он имеет в себе функцию ADC ....Но быть может , мне было выгоднее хранить обект , присвоив его указателю на void ..... Мне самому , сложно ответиить на этот вопрос , так как есть более мелкие недопонимания , которые я и изложил выше Заранее благодарю за ответ ....
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2013, 10:27
Ответы с готовыми решениями:

Выделение памяти под типы данных - нужен совет!
Подскажите, пожалуйста: Внутри функции main() завожу подряд несколько переменных (new не...

Выделение памяти под массив объектов
У меня есть класс Shape. Требуется выделить память под массив этих объектов. К примеру: *Shape...

Выделение памяти под массив объектов без вызова конструктора
Добрый вечер. Насколько я знаю, при выделении памяти под массив объектов, для каждого из них...

Выделение памяти под матрицу
Всем привет. float **AllocMat(int Rows, int Colomns) { float ** Mat; try...

9
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.04.2013, 10:46 2
для начала ознакомтесь: Строковые литералы в Си/Си++

Добавлено через 2 минуты
Цитата Сообщение от z1p0 Посмотреть сообщение
Размер указателя (В MSVC 2010 - 4 байта) + размер внутренностей , этого указателя , то есть 4 Байта(char(1 символ) = 1 байт) .... Что в сумме дает ... 8 байт ....Так ли это :?
то что сумма 8 байт - так, но как минимум строковый литерал будет создан const-сегменте защищенном от записи, тогда как указатель будет создан в non-const сегменте

Добавлено через 12 минут
Цитата Сообщение от z1p0 Посмотреть сообщение
char string[] = "ABC";
Та же история, создается массив на 4 байта, но строковому литералу тоже надо откуда-то браться, потому и он будет помещен const-сегменте защищенном от записи. Так что и тут можно сказать что сумма 8 байт. Только и в 1-м и во 2-м примере 4 байта(на указатель в 1-м примере, и на массив во 2-м примере) выделяются во время работы программы. Тогда как 4 байта литерала это данные программы.
Если напишем так
C++
1
2
const char* pstr = "ABC";
char arr[] = "ABC";
то компилятор вполне может "закэшировать" строковый литерал "ABC", только в 1-й строке создается указатель на уже существующий литерал, а во 2-й будет создан массив на 4 байта в который будет скопировано содежимое литерала.
3-й пример аналогичен первому.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
19.04.2013, 11:01 3
В дополнение к посту 2:
C++
1
2
const char* pstr1 = "ABC";
const char* pstr2 = "ABC";
pstr1 и pstr2 скорее всего будут указывать на одну и туже память(хотя все зависит от настроек компилятора)
0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:05  [ТС] 4
А вот третий случай , если брать не те настройки компилятора ... То там выходит , что... Мы имеем Указатель , который ссылается на массив (а массив это у нас тоже указатель) , значит мы имеем 2 указателя ,и внутренности :?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
19.04.2013, 11:16 5
Цитата Сообщение от z1p0 Посмотреть сообщение
А вот третий случай
Цитата Сообщение от Jupiter Посмотреть сообщение
3-й пример аналогичен первому.
вот так. Просто там указатель на void
0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:21  [ТС] 6
Да , то что они аналогичны , я понял , но вот вопрос таков :
C++
1
char *string = "ABC";
Здесь же по сути создается 2 указателя ....Указатель на Чар , и указатель на массив АБС ...И после , мы это дело приравниваем , однакож , разве указатель на АБС не занимает места :?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.04.2013, 11:23 7
Цитата Сообщение от z1p0 Посмотреть сообщение
разве указатель на АБС не занимает места :?
занимает место сама строка, а в string записывается адрес этой строки
0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:28  [ТС] 8
Вот теперь ясно ... А это значит , что писать длинную арифметику , используя массив символов не выгодно ... Или быть может я не прав :? Все таки , например у Лафоре , в книге , была написана программа для работа с длинными числами ... мои подсчеты , по времени , показали что она не эффективна , а память там выделялась именно массивом символов ....После чего Атои и прочие штучки ...А значит и по памяти это дело неэффективно ....
Так :?

Добавлено через 1 минуту
Ведь , повторюсь в случае использования , напрмиер 16 битных переменных - можно спокойно , брать и вставлять внутрь кода ассемблер ...И производить сложение , и быть может умножение ....И по памяти + , и по времени ... Так по иедее раз в 8
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.04.2013, 11:29 9
Цитата Сообщение от z1p0 Посмотреть сообщение
писать длинную арифметику , используя массив символов не выгодно ... Или быть может я не прав :?
прав, этот вариант
Цитата Сообщение от z1p0 Посмотреть сообщение
массив интов , и каждый инт бы хранил 9 цифр
лучше по памяти
0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:33  [ТС] 10
Огромное всем спасибо , действительно многое смог узнать и укрепить
0
19.04.2013, 11:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2013, 11:33
Помогаю со студенческими работами здесь

Выделение памяти под файл
Всем доброго времени суток. Написал некоторую структуру, работают все пунктики, все функции, но...

Выделение памяти под структуру
Здравствуйте! Задача - написать модуль для работы со строками. Структуру менять нельзя, можно...

Выделение памяти под int
Добрый день!! Недавно начал разбираться с С#. Есть теоретический вопрос: int (System.Int32) в...

Выделение памяти под структуры
Когда я только знакомился с кодингом на С(С++) я скачивал с инета очень много всякой литературы......


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

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

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