Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Занимает пмаяти прога больше чем надо, Почему? 
:(
    Опции темы
gepard
  Дата 14.6.2004, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Код

#include <stdio.h>
struct cls
{
float  f1;
float  f2;
float  f3;
float  f4;
float  f5;
int  i1;
int  i2;
int  i3;
bool  b1;
bool  b2;
double  d1;
};
void main()
{
printf("%d\n", sizeof(cls));
printf("%d\n", sizeof(int)*3+sizeof(float)*5+sizeof(double)+sizeof(bool)*2);
}

Появится две строчки:
Цитата

48
42

Как так? Куда память утекает?


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
chipset
Дата 14.6.2004, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



а сама структура разве не учитывается? withstupid.gif


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
bel_nikita
Дата 14.6.2004, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



gepard
Дык, а про выравнивание забыл? smile.gif
Цитата
#pragma pack(push, _Struct, 1) // выставляем границу выравнивания в 1 байт
struct cls
{
float  f1;
float  f2;
float  f3;
float  f4;
float  f5;
int i1;
int i2;
int  i3;
bool  b1;
bool  b2;
double  d1;
};
#pragma pack(pop, _Struct) // выравнивание по дефолту

Вот теперь проверь thumbs-up.gif

Это сообщение отредактировал(а) bel_nikita - 14.6.2004, 08:34


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
gepard
Дата 14.6.2004, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



chipset
Цитата
а сама структура разве не учитывается?

1 b, но никак не 6.
bel_nikita
Блин, вот что значит кодить в 1 ночи wow.gif
До этого сидел листал посты с форума и видел тему про выравнивание. Почитал же ещё!
Всё, пора завязывать bored.gif
Кстати, а что творит это выравнивание?
Как определить, когда его надо использовать(кроме проверки на размер структуры, конечно )

Это сообщение отредактировал(а) gepard - 14.6.2004, 15:33


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 14.6.2004, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



gepard
Цитата
Как определить, когда его надо использовать(кроме проверки на размер структуры, конечно )

Очень просто. Стандартно граница выравнивания стоит в 8 байт. Вообще-то это доку к компилеру смотреть надо. Там такие вещи обязательно пишут.
Так, вот, если ты используешь структуры или классы в которых есть типы меньше 8 байт, то надо выравнивать. Хотя не обязательно. Это смотря для чего используется структура. Например, если ты некий класс или структуру проецируешь на память. Ну или, например чтение с файла. Ты знаешь, что данные в файле записаны в виде cls . Тебе надо их считать. Так вот, если у тебя выравнивание в 8 байт, то будут траблы tounge.gif

Рано или поздно у всех такие проблемы возникают. И довольно часто задаются вопросы по этому поводу. Только вот в FAQ этого почему-то нет sad.gif

Вот, два примера. Посмотри как память распределяется. Думаю все ясно станет
Код
//#pragma pack(push, _Struct, 1)
struct cls
{
unsigned   f1;
unsigned  f2;
unsigned char  f3;
unsigned char  f4;
unsigned  f5;
};
//#pragma pack(pop, _Struct)

/*
         unsigned  unsigned  unsigned  unsigned  unsigned
                              char     char
            f1        f2       f3        f4         f5
 bytes: [1|2|3|4] [5|6|7|8]  [9|10]   [11|12] [13|14|15|16]

 sizeof()=16

*/

Код
#pragma pack(push, _Struct, 1)
struct cls
{
unsigned   f1;
unsigned  f2;
unsigned char  f3;
unsigned char  f4;
unsigned  f5;
};
#pragma pack(pop, _Struct)


/*
         unsigned  unsigned  unsigned  unsigned  unsigned
                              char     char
            f1        f2       f3        f4         f5
 bytes: [1|2|3|4] [5|6|7|8]   [9]       [10]   [11|12|13|14]

 sizeof()=14

*/

Наверное еще будет вопрос: А почему имеено выравнивание по границе 8 байт, а не 1. Ответ прост - оптимизация smile.gif


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
gepard
Дата 14.6.2004, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Цитата
Рано или поздно у всех такие проблемы возникают. И довольно часто задаются вопросы по этому поводу. Только вот в FAQ этого почему-то нет

По-моему стоило бы поместить в FAQ.
bel_nikita
Спасибо, за объяснение.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
lynx_916
Дата 14.6.2004, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 316
Регистрация: 13.6.2004
Где: Молдова

Репутация: нет
Всего: 1



не КБ а Б
размер-то в байтах!

Это сообщение отредактировал(а) lynx_916 - 14.6.2004, 11:26


--------------------
Who dares, wins. (с) Solid Snake
PM MAIL ICQ YIM MSN   Вверх
gepard
Дата 14.6.2004, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2477
Регистрация: 29.2.2004

Репутация: 2
Всего: 40



Цитата
не КБ а Б
размер-то в байтах!

Без флейма.


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.