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

Почему для пустого класса или структуры выделяется 1 байт?

03.03.2016, 15:05. Показов 10395. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
С коллегой знаем, что для пустого класса или структуры выделяется 1 байт. Но нигде не можем найти почему именно один байт. Но такая информация с объяснением где то была. Никто не может подсказать почему имено один 1 байт? Было бы хорошо ссылку на источник.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2016, 15:05
Ответы с готовыми решениями:

Если для структуры используется оператор new, то память выделяется в куче или на стеке?
Если для структуры используется оператор new, например, так: struct SomeStruct { }

Почему часть или буква выделяется красным цветом?
почему когда вводиш функцыю или совершаеш другое действие то часть или буква выделяется красным цветом

Почему на указатель в 64-разрядной системе выделяется 8 байт памяти, а в 32-разрядной системе - 4 байта?
Здравствуйте! Почему на указатель в 64-разрядной системе выделяется 8 байт памяти, а в 32-разрядной системе - 4 байта? С чем связано...

62
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
03.03.2016, 15:09
Евгений Рим, Получите и распишитесь.
2
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
03.03.2016, 15:10
Лучший ответ Сообщение было отмечено Евгений Рим как решение

Решение

Потому что объект должен занимать память, поэтому для объекта пустого класса выделяется 1 фиктивный байт. Почему именно 1? А зачем больше? С++ аккуратно с памятью обращается, перерасход не нужен.
2
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
03.03.2016, 15:11
И да, для объекта выделяется 1 байт, а не для самого класса. Для класса не выделяется память, пока не создан объект этого класса.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.03.2016, 15:19
Для экземпляра класса в иерархии наследования может и не выделится память, как я помню, а для объекта минимум 1 байт.
2
1 / 1 / 1
Регистрация: 20.08.2015
Сообщений: 35
03.03.2016, 15:52  [ТС]
Всем спасибо! Всем по респекту!
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.03.2016, 19:06
Цитата Сообщение от makfak Посмотреть сообщение
Для класса не выделяется память, пока не создан объект этого класса.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Для экземпляра класса в иерархии наследования может и не выделится память
классы не кушают память, и не существуют после компиляции.
вы о чем вообще?

наверное опять попутали с объектами и подобъектами.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
03.03.2016, 19:24
Цитата Сообщение от hoggy Посмотреть сообщение
вы о чем вообще?
да всё о том же (

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
 
struct A
{
};
struct B : public A
{
    int _a;
};
 
int main()
{
    B b;
 
    cout <<( (int)&b == (int)&b._a) << endl;
}
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
03.03.2016, 19:39
Цитата Сообщение от hoggy Посмотреть сообщение
вы о чем вообще?
Я о том, что для класса в программе не выделяется память в общем. Она выделяется для объекта, а не для класса.

Добавлено через 2 минуты
Пример:
C++
1
2
3
4
5
6
7
class a {}; // память не выделилась, класс пустой и просто, скорее всего(я не утверждаю), удалился
// компилятором
class b { int a; int b; }; // память не выделилась потому что экземпляра класса не было создано
 
int main()
{
}
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.03.2016, 15:19
Пустые структуры есть в языке C++ и в языке GNU C. В GNU C пустая структура занимает 0 байт, в C++ - 1 байт

C
#include <stdio.h>
 
struct s { } S1, S2;
 
int main (void)
{
  printf("%p %p\n", &S1, &S2);
  return 0;
}
Code
$ gcc t.c
$ ./a.out
0x804962c 0x804962c
 
$ g++ t.c
$ ./a.out
0x80496f4 0x80496f5
В C++ так cделано ради того, чтобы два различных объекта гарантированно имели разные адреса в памяти. Чтобы имея на руках два указателя всегда можно было их сравнить и понять, являются они указателями на один объект, или на разные. Необходимость в этом, насколько я могу подозревать, растёт из каких-то стандартных контейнеров (наверное map или что-то типа того). В C нету такого сложного библиотечного обвеса, встроенного в язык, а потому в GNU C такой ерундой не занимались

Добавлено через 2 минуты
Цитата Сообщение от makfak Посмотреть сообщение
И да, для объекта выделяется 1 байт, а не для самого класса
Строго говоря, это не так

C
#include <stdio.h>
 
struct s { };
 
int main (void)
{
  printf("%ld\n", sizeof (struct s));
  return 0;
}
Code
$ gcc t.c
$ ./a.out
0
 
$ g++ t.c
$ ./a.out
1
Размер в 1 байт получает именно класс (ну и автоматически - объекты этого класса)
4
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
04.03.2016, 15:54
Цитата Сообщение от Evg Посмотреть сообщение
Размер в 1 байт получает именно класс
Вопрос из области философии, т.к. "the truth is that there is no class"© Класса не существует, существует объект класса
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.03.2016, 16:01
В гугле так и не смог найти ответ на вопрос, зачем требуется уникальность адреса объекта. На это свойство многие ссылаются, но нигде не объясняется, ради чего это нужно. Вот, например, цитата с одного из форумов

Объект в ООП обладает некоторым набором свойств, одно из которых -- идентичность, свойство быть идентифицируемым каким-то образом. В С++ конкретно это свойство достигается тем, что каждый уникальный объект имеет свой уникальный адрес в памяти, который является его уникальным идентификатором в программе
возможно, что такая формулировка натолкнёт на мысль кого-то из тех, кто активно программирует на C++

Тут заглянули в Страуструпа, даже там написано только то, что разные объекты должны иметь разные адреса, а зачем - хз. Вообще при таком раскладе возникает сильное подозрение, что это борьба с каким-то из косяков языка или библиотеки, но с чем именно, соображений никаких нет. Возможно, что если мы построим массив из пустых структур, отдадим в какой-то из контейнеров, в котором есть деление на sizeof одного элемента, то будет деление на ноль, но я себе не представляю такой контейнер (шаблон)

В общем, вопрос довольно-таки мутный

Добавлено через 1 минуту
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вопрос из области философии, т.к. "the truth is that there is no class"© Класса не существует, существует объект класса
Тем не менее оператор sizeof применим к типу, а потому понятие "размер класса" - оно скорее реальное, чем философское
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
04.03.2016, 16:06
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от Evg Посмотреть сообщение
GNU C
А шо, есть такой язык - гнусь? Я думал, что есть язык просто С, а GNU С - всего лишь нестандартизированное расширение. Которое в том числе добавляет эти нулевые структуры, хотя они вообще по стандарту - UB.

Цитата Сообщение от Evg Посмотреть сообщение
Размер в 1 байт получает именно класс
1) Что значит - класс размером 1 байт?
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.
4
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.03.2016, 16:19
Цитата Сообщение от Evg Посмотреть сообщение
Строго говоря, это не так
Так. )
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.03.2016, 16:30
С любителями цепляться к формулировкам я обычно не спорю

Если ТС'а удовлетворяет ответ "1 байт, потому что так написано в стандарте" - значит ему этого достаточно. Лично мне было интересно копнуть глубже и понять, "а почему (ради чего) так в стандарте написано"
3
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.03.2016, 16:50
Evg, вы любой спор и тему сводите к своему СИ коду. Не надо так.

Название: 13745795479848.gif
Просмотров: 136

Размер: 10.7 Кб
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.03.2016, 17:13
ct0r, размер есть только у экземпляра, это верно. Но Evg, говорит всегда вещи, о которых очень интересно думать. Дело в том, что тип может определяться вместе с экземпляром и это даёт очень странные синтаксические возможности. То есть, возможность появления имени тега параметром в функции 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
#include <iostream> 
using namespace std; 
void main()
{
//от С в C++ перешло определение структур тегом
//при чем тег может быть безымянным (он сам имя):
    struct
    {
int a; 
    } myTaggedStructObject;
 
//Это значит не только то что типом является тег то есть строка от буквы s в слове
//  struct
//до закрывающей скобки
// это значит что тип можно определить локально!
 
 
//классы не отстают (равноправие - принцип Страуструпа)):
class  
    {
    public:
int a;
int b;
int sum(){return a+b;}//обёрнутая в тег типа функция, фактически получает локальное объявление! 
    } myTaggedClassObject;
myTaggedClassObject.a=1;
myTaggedClassObject.b=2;
cout<<myTaggedClassObject.a<<" "<<myTaggedClassObject.b<<" "<<myTaggedClassObject.sum()<<endl;
size_t myNoNameTaggedClassObjectSize=sizeof(myTaggedClassObject);
cout<<myNoNameTaggedClassObjectSize<<endl;
 
 
//а вот с именованным тегом: 
class T 
    {
    public:
int a;
int b;
    } myNamedTagClassObject;
 
size_t myTaggedClassObjectSize=sizeof(class T);//имя тега может содержать слово class или struct
cout<<myTaggedClassObjectSize<<endl;
cout<<endl;
system("pause");    
}


Добавлено через 7 минут
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Evg, вы любой спор и тему сводите к своему СИ коду. Не надо так.
Любой спор сводится к аргументации. Это программистский форум и код тут уместен как аргумент. Если нет других аргументов.
Хотя спор это полезная вещь если личная амбиция не выше желания понять оппонента. Иногда речь идёт о противоречивых понятиях и несмотря на устоявшееся мнение, рассуждение о таких вещах может быть полезно. Именно это расширяет понимание.
Цитата Сообщение от Evg Посмотреть сообщение
Лично мне было интересно копнуть глубже и понять, "а почему (ради чего) так в стандарте написано"
__________________
Жирнющий + !
Мне тоже интересно.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.03.2016, 17:19
IGPIGP, просто тяжело глазам видить, что любое событие в С++ человек пытается объяснить на основе СИ кода. Давайте сразу на PHP.

Я не против, просто режит вечно слух: "В С++ так, а СИ вообще так". "Вот в С++ есть такое, а СИ ему замена это". Два языка идут в 21 веке своей жизнью отдельно.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
04.03.2016, 17:29
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
человек пытается объяснить на основе СИ кода. Давайте сразу на PHP.
PHP, не к ночи упомянто, тут как-то вообще не к месту, фраза "давайте сразу на ассемблере" звучала было более культурно.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.03.2016, 17:37
Kastaneda, я погарячился с PHP, прошу прощение Evg . А так я про СИ теги и коды при каждом случаи в С++ разделе. С новой философией "Modern C++", что вводят сейчас Страуструп и КО - думаю к СИ методам будут прибегать только в высоконагруженных местах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.03.2016, 17:37
Помогаю со студенческими работами здесь

Почему не выделяется дополнительная память для приложения
В некоторых участках кода выдает ошибку памяти. Сначала я подумал что создается она определенной длины. Получалось создать размером 1000 и...

При сохранении выделяется только 512 байт на файл
Привет всем!!! У меня есть текстовой файл В котором хранится массив строк Открытие файла работает нормально но при сохранении выделяется...

Почему при создании пустого проекта не открывается окно для написания кода? Visual Studio 2010
Парни не подскажете почему при создании пустого проекта не открывается окно для написания кода? P.S. У меня студия 2010. Не стоит...

При попытке создать динамический одномерный массив, под него выделяется только 8 байт памяти
Доброго времени суток. Проблема в следующем: при попытке создать динамический одномерный массив, под него выделяется только 8 байт...

Написать шаблон класса на основе класса vector для реализации стековой структуры данных
Пыталась написать код, но не уверена будет ли такая реализация корректной, можно ли это сделать как-то по - другому? И как надо...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru