Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
z1p0
0 / 0 / 0
Регистрация: 17.08.2012
Сообщений: 29
#1

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

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

Всем здрасти
У меня вот такой вопрос , а точнее даже вопросы ...
допустим есть код :
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.04.2013, 10:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стандартные типы объектов в C++ и выделение памяти под них (C++):

Выделение памяти под массив объектов - C++
У меня есть класс Shape. Требуется выделить память под массив этих объектов. К примеру: *Shape **shapes; *shapes = new Shape; После...

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

Выделение памяти под матрицу - C++
Всем доброго времени суток! Есть такая проблема, у меня есть свой класс Cell. Мне нужно создать матрицу объектов этого типа и выделить под...

Выделение памяти под wchar_t - C++
вот такой код: char *str=new char; strcpy(str,"stroka"); int l=strlen(str); wchar_t *wstr=new wchar_t; mbstowcs(wstr,str,l); ...

Выделение памяти под матрицу - C++
Существует такой класс: class matr{ public: double **m; // адрес матрицы int mi, my; //стобцы, строки //функции ...

Выделение памяти под массивы - C++
int **mas1 = new int*; for (int e = 0; e < q; e++) mas1 = new int; int **mas2 = new int*; for (int q = 0; q < e;...

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

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

Выделение памяти под массив - C++
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? //глобальная область int x_size = 3; ...

Выделение памяти под масссив - C++
Как занести данные в двумерный массив с клавиатуры? пользователь должен сам ввести размерность

Выделение памяти под строку - C++
Никак не могу понять, в чем проблема, подскажите пожалуйста. Предположим, инициализирую переменную, ожидая получить строку из 10...

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


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

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

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