Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 9

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

16.05.2012, 23:44. Показов 2355. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.05.2012, 23:44
Ответы с готовыми решениями:

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

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

Правильно ли определять размер объекта класса операцией sizeof?
будет ли правильно определить размер объекта класса операцией sizeof() ? чойто у меня неадекватные цыфры выдаёт, как мне кацца:dance:

4
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
17.05.2012, 00:02
Все переменные содержащиеся в структуре. Конкретно в данном случае у вас структура наследуется от класса ImplClass, который содержит всего одно поле int ( int state_ ) вот это поле и занимает как раз 4 байта, а функции не учитываются при подсчёте размера, т.к. являются разделяемым ресурсом и являются членами классов только на уровне исходного кода, ну это я так считаю
0
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
17.05.2012, 00:08
как хранится в памяти структуры!

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

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

Добавлено через 2 минуты
ой нет, всё правильно!!!!!! я убрала виртуал и получился 1 байт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2012, 20:56
Помогаю со студенческими работами здесь

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

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

как вставить sizeof и зачем ?
#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() и зачем она в этой программе
Напишите программу, которая, используя только унарные, бинарные операторы и sizeof() выводит, введѐнную пользователем переменную,...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru