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

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

Восстановить пароль Регистрация
 
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 10:27     Стандартные типы объектов в C++ и выделение памяти под них #1
Всем здрасти
У меня вот такой вопрос , а точнее даже вопросы ...
допустим есть код :
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 ..... Мне самому , сложно ответиить на этот вопрос , так как есть более мелкие недопонимания , которые я и изложил выше Заранее благодарю за ответ ....
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 10:27     Стандартные типы объектов в C++ и выделение памяти под них
Посмотрите здесь:

Выделение памяти под строку C++
Выделение памяти под массив C++
Выделение памяти под массив объектов без вызова конструктора C++
C++ выделение памяти под структуру
Выделение памяти под указатель C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 10:46     Стандартные типы объектов в C++ и выделение памяти под них #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-й пример аналогичен первому.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
19.04.2013, 11:01     Стандартные типы объектов в C++ и выделение памяти под них #3
В дополнение к посту 2:
C++
1
2
const char* pstr1 = "ABC";
const char* pstr2 = "ABC";
pstr1 и pstr2 скорее всего будут указывать на одну и туже память(хотя все зависит от настроек компилятора)
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:05  [ТС]     Стандартные типы объектов в C++ и выделение памяти под них #4
А вот третий случай , если брать не те настройки компилятора ... То там выходит , что... Мы имеем Указатель , который ссылается на массив (а массив это у нас тоже указатель) , значит мы имеем 2 указателя ,и внутренности :?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
19.04.2013, 11:16     Стандартные типы объектов в C++ и выделение памяти под них #5
Цитата Сообщение от z1p0 Посмотреть сообщение
А вот третий случай
Цитата Сообщение от Jupiter Посмотреть сообщение
3-й пример аналогичен первому.
вот так. Просто там указатель на void
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:21  [ТС]     Стандартные типы объектов в C++ и выделение памяти под них #6
Да , то что они аналогичны , я понял , но вот вопрос таков :
C++
1
char *string = "ABC";
Здесь же по сути создается 2 указателя ....Указатель на Чар , и указатель на массив АБС ...И после , мы это дело приравниваем , однакож , разве указатель на АБС не занимает места :?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 11:23     Стандартные типы объектов в C++ и выделение памяти под них #7
Цитата Сообщение от z1p0 Посмотреть сообщение
разве указатель на АБС не занимает места :?
занимает место сама строка, а в string записывается адрес этой строки
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:28  [ТС]     Стандартные типы объектов в C++ и выделение памяти под них #8
Вот теперь ясно ... А это значит , что писать длинную арифметику , используя массив символов не выгодно ... Или быть может я не прав :? Все таки , например у Лафоре , в книге , была написана программа для работа с длинными числами ... мои подсчеты , по времени , показали что она не эффективна , а память там выделялась именно массивом символов ....После чего Атои и прочие штучки ...А значит и по памяти это дело неэффективно ....
Так :?

Добавлено через 1 минуту
Ведь , повторюсь в случае использования , напрмиер 16 битных переменных - можно спокойно , брать и вставлять внутрь кода ассемблер ...И производить сложение , и быть может умножение ....И по памяти + , и по времени ... Так по иедее раз в 8
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.04.2013, 11:29     Стандартные типы объектов в C++ и выделение памяти под них #9
Цитата Сообщение от z1p0 Посмотреть сообщение
писать длинную арифметику , используя массив символов не выгодно ... Или быть может я не прав :?
прав, этот вариант
Цитата Сообщение от z1p0 Посмотреть сообщение
массив интов , и каждый инт бы хранил 9 цифр
лучше по памяти
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2013, 11:33     Стандартные типы объектов в C++ и выделение памяти под них
Еще ссылки по теме:

Выделение памяти под массив объектов C++
Выделение памяти под массивы C++
выделение памяти под структуру C++

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

Или воспользуйтесь поиском по форуму:
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
19.04.2013, 11:33  [ТС]     Стандартные типы объектов в C++ и выделение памяти под них #10
Огромное всем спасибо , действительно многое смог узнать и укрепить
Yandex
Объявления
19.04.2013, 11:33     Стандартные типы объектов в C++ и выделение памяти под них
Ответ Создать тему
Опции темы

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