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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Память на пустой класс 
V
    Опции темы
Hacknslash
Дата 2.7.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте! В процессе подготовки к экзамену по сям наткнулся на такую штуку:
Если просто объявить пустой класс и взвесить его при помощи sizeof, то он будет весить 8 байт, а если добавить в этот класс одно поле integer, то уже 4 байта... Объясните пожалуйста, на что расходуется память в первом случае)

PM MAIL   Вверх
mes
Дата 2.7.2009, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Hacknslash @  2.7.2009,  19:03 Найти цитируемый пост)
Если просто объявить пустой класс и взвесить его при помощи sizeof, то он будет весить 8 байт,

какой компилятор так делает ? 
Если не вдаваться в тонкости, то объект пустого класса  занимает не меньше 1го байта.
Меньше он занимать не может по стандарту, так как в противном случае  массив таких объектов занимал бы бы тоже 0 байт, а это лишено смысла.
А больше занимать ему не зачем (за исключением случая когда класс имеет виртуальные функции).





--------------------
PM MAIL WWW   Вверх
Hacknslash
Дата 2.7.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Билдер шестой) Т.е. если порыться в настройках компилятора, то можно изменить этот размер?)

Цитата

Если не вдаваться в тонкости, то объект пустого класса  занимает не меньше 1го байта.

А  если вдаваться?) Вдруг пойму)

Это сообщение отредактировал(а) Hacknslash - 2.7.2009, 20:19
PM MAIL   Вверх
andrew_121
Дата 2.7.2009, 20:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(Hacknslash @  2.7.2009,  20:17 Найти цитируемый пост)
Билдер шестой

Ты бы еще сам компилятор написал. smile 
Установи нормальный компилятор.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Cheloveck
Дата 2.7.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 5
Всего: 32



Код

#include <iostream>

class empty
{
};

class intonly
{
  int x;
};

int main()
{
  std:: cout << "size of empty: " << sizeof( empty ) << std::endl;
  std::cout << "size of intonly: " << sizeof( intonly ) << std::endl;
  return 0;
}

Код

$ g++ test.cpp -o test
sergey:/tmp/test$ ./test
size of empty: 1
size of intonly: 4

 smile 



--------------------
user posted image
PM Jabber   Вверх
Hacknslash
Дата 2.7.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Установи нормальный компилятор.


Ну у нас в универе стоит именно билдер, поэтому пишу на нем) Не хочу тратить лишнее время на борьбу с интерфейсом при сдаче предмета) 

Это сообщение отредактировал(а) Hacknslash - 2.7.2009, 20:30
PM MAIL   Вверх
ИванМ
Дата 2.7.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



andrew_121, да ладно вам. Билдер нормальный компилятор. Не то, чтобы хороший, но для учебных целей самое то.
PM MAIL   Вверх
Acer
Дата 2.7.2009, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

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



Код

#include <iostream>
//-------------------------------------
class Test1 {

};
//-------------------------------------
class Test2 {
    int foo;
};
//-------------------------------------
class Test3 {
public:
    Test3(){}
    virtual ~Test3(){}
};
//-------------------------------------
class Test4 {
public:
    Test4(){}
    virtual ~Test4(){}
private:
    int foo;
};

//-------------------------------------

int main(int argc, char *argv[]){
    std::cout << "sizeof( Test1 ): " << sizeof( Test1 ) << std::endl;
    std::cout << "sizeof( Test2 ): " << sizeof( Test2 ) << std::endl;
    std::cout << "sizeof( Test3 ): " << sizeof( Test3 ) << std::endl;
    std::cout << "sizeof( Test4 ): " << sizeof( Test4 ) << std::endl;
}


Цитата

reich@rds:~/xcpr/test$ ./test
sizeof( Test1 ): 1
sizeof( Test2 ): 4
sizeof( Test3 ): 4
sizeof( Test4 ): 8


PM MAIL   Вверх
mes
Дата 2.7.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 79
Всего: 250



Цитата(Hacknslash @  2.7.2009,  19:17 Найти цитируемый пост)

А  если вдаваться?) 

вот что пишет стандарт, остальное зависит от разработчиков компилятора :

Цитата(Standart 5.3.3/2)

 Sizeof 
 ... When applied to a class, the result is  the number of bytes in an object of that class including  
 any  padding  required  for placing objects of that type in an array.   The size of a  most derived 
 class shall be greater than zero.   The  result of applying sizeof to a base class subobject is the 
 size  of  the  base  class  type  (The actual size of a base class subobject may be less).  When 
 applied to an array, the result is the  total number  of bytes  in the array. This implies that the 
 size of an array  of n elements is n times the size of an element.


Это сообщение отредактировал(а) mes - 2.7.2009, 20:56


--------------------
PM MAIL WWW   Вверх
Hacknslash
Дата 2.7.2009, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ага, все, спасибо) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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