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

Как sizeof считает размер? - C++

Восстановить пароль Регистрация
 
DEVU
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 9
16.05.2012, 23:44     Как sizeof считает размер? #1
Есть код программы. Скажите как определить размерность структуры? Дело в том что выдает 4 байта, но хотелось бы узнать как это делает программа по шагам? то есть откуда в принципе эти 4 байта берутся, которые sizeof выводит?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
 
class ImplClass //ГЎГ*çîâûé ГЄГ«Г*Г±Г±
{
public:
   void do_work_1()
   {
      std::cout << "Doing some work 1" << std::endl;
   }
   
   virtual void do_work_2()
   {
      std::cout << "Doing some work 2 in base implementation class" << std::endl;
   }
};
 
class Derived : protected ImplClass // protected inheritance should be used as implementation
{
protected:
   virtual void do_work_2() // ïåðåîïðåäåëåГ*ГЁГҐ ГЎГ*çîâîãî ГЄГ«Г*Г±Г±Г*
   {
      std::cout << "Doing some other work 2 in derived class" << std::endl;
   }
public:
   void perform_operation()
   {
      // calling some implementation methods.
      // Usually, this is achieved using PImpl idiom (except some moments), but here we have a directive
      do_work_1(); // calling method of base class, which is protected for us.
      do_work_2();
      
      // Doing some important work with added class members.
      state_ = 42;
   }
   
private:
   int state_;
};
 
struct DerivedStruct : protected ImplClass
{
// public - îïðåäåëåГ*ГЁГҐ Г*ГҐ Г*ГіГ¦Г*Г®. 
   void perform_operation()
   {
      do_work_1();
      do_work_2(); // not overriden here
   }
};
 
 
int main(int /*argc*/, char ** /*argv*/)
{
  /* Derived d;
   d.perform_operation();
      DerivedStruct ds;
   ds.perform_operation(); */
   
   
   std::cout << "sizeof(Widget)" << sizeof(DerivedStruct) << std::endl; //4
   system("Pause");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.05.2012, 00:02     Как sizeof считает размер? #2
Все переменные содержащиеся в структуре. Конкретно в данном случае у вас структура наследуется от класса ImplClass, который содержит всего одно поле int ( int state_ ) вот это поле и занимает как раз 4 байта, а функции не учитываются при подсчёте размера, т.к. являются разделяемым ресурсом и являются членами классов только на уровне исходного кода, ну это я так считаю
Infinity3000
 Аватар для Infinity3000
1057 / 576 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
17.05.2012, 00:08     Как sizeof считает размер? #3
как хранится в памяти структуры!

немного теории!

Расставим точки над структурами C/C++
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
17.05.2012, 11:12     Как sizeof считает размер? #4
Цитата Сообщение от Buckstabue Посмотреть сообщение
ImplClass, который содержит всего одно поле int
Это Derived содержит одно поле типа int. ImplClass же содержит виртуальную функцию, а значит и его объекты, и объекты классов, наследующих ImplClass, нужен один неявный дополнительный указатель, содержащий адрес таблицы виртуальных функций для данного класса. Вот он-то и занимает пресловутые 4 байта. Чтобы убедиться в этом, достаточно убрать ключевое слово virtual у метода do_work_2 класса ImplClass, после чего размер будет 1 байт, а не 4 (так и должно быть для пустой структуры).
А по теме - sizeof ничего в сущности не считает, в конечном итоге это константа времени компиляции, поскольку компилятор знает (или может посчитать) размеры всех использующихся типов данных и их комбинаций.
DEVU
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 9
17.05.2012, 20:56  [ТС]     Как sizeof считает размер? #5
ребята, я закомментировала строчки, где всё связано с int и переменной стэйт и всё равно мне выводит 4 байта. так а как это объясняется?

Добавлено через 2 минуты
ой нет, всё правильно!!!!!! я убрала виртуал и получился 1 байт.
Yandex
Объявления
17.05.2012, 20:56     Как sizeof считает размер?
Ответ Создать тему
Опции темы

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