Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2009, 14:07   #1
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию Вес объекта

Здраствуйте, в данный момент изучаю классы.
После того как я прочел про динамическое выделение памяти,
у меня возник ряд вопросов:
1)Откуда компилятор знает сколько нужно выделить памяти под объект (от чего это зависит)?
Я попробовал сам ответить на свой вопрос, и проверить с помощью
sizeof() сколько памяти занимает объект.
вот класс(проверочный):
Код:
class D
{   
public:
     int a;
     int b;       
};

void main()
{  
      D obj;
      cout<<"The size of the object is: "<<sizeof(obj)<<endl;
}
Как я и ожидал напечаталось 8(байт).
Затем, я добавил переменную типа char, чтобы убедится что вес зависит от типа и количества переменных. Я ожидал увидить 9(char = 1 byte)
а увидел 12 как если б это был тип int. Как это можно объяснить...?

2)Можно ли расширить границы массива с помощью new?
Например:
Код:
void main()
{
     	char name[5];
           cout<<"Enter name: ";
	cin>>name;
	if(strlen(name)>5)
	{
	      char *ptr = new char[15];
	       ...//Здесь добавление/объединение новой памяти со "старой"
	       ...
             }
}
p.s.
Код:
cout<<"Enter name: ";
	cin>>name;
	if(strlen(name)>5)
В этом примере, скорее всего будет ошибка в процессе выполнения, из за записи памяти на невыделеные участки...И код прервется не дойдя до if(strlen(name)>5).
p.p.s. Можно ди проверить длину строки еще в потоке/ буфере?
JOFRIF вне форума Ответить с цитированием
Старый 30.08.2009, 15:34   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Очевидно, что данные класса выровнены по границе в 4 байта. Размер его всегда будет кратным четырём, то есть если в данном случае добавить ещё одну переменную типа char, то его размер не изменится. Для считывания строк переменной длинны можно использовать средства стандартной библиотеки: std::getline и std::string.
Код:
#include <iostream>
#include <string>

int main()
{
	std::string name;

	std::cout << "Enter your name: ";
	std::getline(std::cin, name);  // первый параметр - откуда читать(можно и из файлов), второй - куда.

	std::cout << "Your name is " << name << std::endl;

	return 0;
}

Последний раз редактировалось netrino; 30.08.2009 в 15:36.
netrino вне форума Ответить с цитированием
Старый 30.08.2009, 15:44   #3
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Очевидно, что данные класса выровнены по границе в 4 байта. Размер его всегда будет кратным четырём, то есть если в данном случае добавить ещё одну переменную типа char, то его размер не изменится. Для считывания строк переменной длинны можно использовать средства стандартной библиотеки: std::getline и std::string.
Код:
#include <iostream>
#include <string>

int main()
{
	std::string name;

	std::cout << "Enter your name: ";
	std::getline(std::cin, name);  // первый параметр - откуда читать(можно и из файлов), второй - куда.

	std::cout << "Your name is " << name << std::endl;

	return 0;
}
Понятно...
p.s про getline и тип string я знаю, я имел ввиду непосредственно в потоке проверять длину строки.
p.p.s Убедительная просьба ответить на второй вопрос
JOFRIF вне форума Ответить с цитированием
Старый 30.08.2009, 15:50   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
2)Можно ли расширить границы массива с помощью new?
если ты перед этим ты освободишь старую память, а новую запросишь. естественно, все данные, которые хранились у тебя в старой памяти, будут освобождены. в плюсах нет такого, как в си realloc.
и ты прав, в этом примере будет ошибка
проще используй станлартные плюсовские строки
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 30.08.2009, 15:58   #5
JOFRIF
Форумчанин
 
Регистрация: 21.04.2008
Сообщений: 164
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
если ты перед этим ты освободишь старую память, а новую запросишь. естественно, все данные, которые хранились у тебя в старой памяти, будут освобождены. в плюсах нет такого, как в си realloc.
и ты прав, в этом примере будет ошибка
проще используй станлартные плюсовские строки
Все ясно...Спасибо netrino, progger

p.s Буду пользоваться стрингами
JOFRIF вне форума Ответить с цитированием
Старый 31.08.2009, 15:51   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

А если нужны массивы переменной длины не только для char - воспользуйтесь стандартными контейнерами!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вес баз антивируса Касперского Терминатор Безопасность, Шифрование 11 04.08.2009 23:03
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37
Как поменять одну из текстур объекта не меняя все остальные и без повторной загрузки объекта в GLScene DomKr@t Мультимедиа в Delphi 0 14.12.2008 01:52
Дан файл, содержащий информацию о багаже нескольких пасажиров (кол-во вещей и их общий вес) MariyaVo Паскаль, Turbo Pascal, PascalABC.NET 4 08.12.2008 23:10
вижение объекта BuT@JL Помощь студентам 4 28.11.2008 19:35