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

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

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

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

16.05.2012, 23:44. Просмотров 1133. Ответов 4
Метки нет (Все метки)

Есть код программы. Скажите как определить размерность структуры? Дело в том что выдает 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");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2012, 23:44
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как sizeof считает размер? (C++):

Sizeof: как правильно найти размер авторского типа? - C++
#include &lt;stdio.h&gt; using namespace std; class kl { }; ///////////////////////////////////////

Sizeof(.) или constexpr size_t tmp = sizeof(.) - C++
sizeof(...) или constexpr size_t tmp = sizeof(...) Как лучше с точки зрения производительности? правильности?

Fwrite (buffer , sizeof(char), sizeof(buffer), pFile) - C++
как записать часть массива чаров? допустим у нас arr; мне надо записать с позиции массива 500 до 600, 100 байтов как записать эту...

Как использовать sizeof? - C++
1. Создать массив; 2. Инициализировать массив, используя пользовательский ввод; 3. Просуммировать все элементы массива, результат...

как вставить sizeof и зачем ? - C++
#include &lt;iostream&gt; using namespace std; void Bits(int p, int n, unsigned long &amp;x) { for(int i = 0, j = p; i &lt; n; i++,...

Объясните, как работает sizeof() и зачем она в этой программе - C++
Напишите программу, которая, используя только унарные, бинарные операторы и sizeof() выводит, введѐнную пользователем переменную, логически...

4
Buckstabue
177 / 126 / 6
Регистрация: 12.01.2012
Сообщений: 624
17.05.2012, 00:02 #2
Все переменные содержащиеся в структуре. Конкретно в данном случае у вас структура наследуется от класса ImplClass, который содержит всего одно поле int ( int state_ ) вот это поле и занимает как раз 4 байта, а функции не учитываются при подсчёте размера, т.к. являются разделяемым ресурсом и являются членами классов только на уровне исходного кода, ну это я так считаю
0
Infinity3000
1060 / 579 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
17.05.2012, 00:08 #3
как хранится в памяти структуры!

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

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

Добавлено через 2 минуты
ой нет, всё правильно!!!!!! я убрала виртуал и получился 1 байт.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2012, 20:56
Привет! Вот еще темы с ответами:

sizeof( char * ) & sizeof(char) - C++
Здравствуйте, не могу понять почему sizeof(char *) = 4 а sizeof(char) = 1. Ну с последним ясно , а вот с первым непойму... Может кто-то...

как зациклить switch, чтобы после того как я допустим ввожу f и он считает циклом for, потом снова просил введите символ - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;math.h&gt; using namespace std; int main() { float x=0.2,y,s=0; int...

Sizeof - C++
int a = { 1, 2, 3, 4 },n = sizeof(a) / sizeof(a); Битый час разбираюсь с этой строкой,но понять не могу. Мы делим массив &quot;a&quot; на...

sizeof() - C++
Ребята,объясните пожалуйста для чего нужен sizeof()?А то в книге очень заумно написано...


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

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

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