|
1 / 1 / 1
Регистрация: 20.08.2015
Сообщений: 35
|
|
Почему для пустого класса или структуры выделяется 1 байт?03.03.2016, 15:05. Показов 10395. Ответов 62
Метки нет (Все метки)
С коллегой знаем, что для пустого класса или структуры выделяется 1 байт. Но нигде не можем найти почему именно один байт. Но такая информация с объяснением где то была. Никто не может подсказать почему имено один 1 байт? Было бы хорошо ссылку на источник.
0
|
|
| 03.03.2016, 15:05 | |
|
Ответы с готовыми решениями:
62
Если для структуры используется оператор new, то память выделяется в куче или на стеке? Почему часть или буква выделяется красным цветом? Почему на указатель в 64-разрядной системе выделяется 8 байт памяти, а в 32-разрядной системе - 4 байта? |
|
|
|
| 03.03.2016, 15:10 | |
Сообщение было отмечено Евгений Рим как решение
Решение
Потому что объект должен занимать память, поэтому для объекта пустого класса выделяется 1 фиктивный байт. Почему именно 1? А зачем больше? С++ аккуратно с памятью обращается, перерасход не нужен.
2
|
|
|
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
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 03.03.2016, 19:06 | |||
|
вы о чем вообще? наверное опять попутали с объектами и подобъектами.
0
|
|||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|||||||
| 03.03.2016, 19:24 | |||||||
0
|
|||||||
|
Любитель чаепитий
|
|||||||
| 03.03.2016, 19:39 | |||||||
|
Добавлено через 2 минуты Пример:
0
|
|||||||
|
|
||
| 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 Добавлено через 2 минуты 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
4
|
||
|
|
|||
| 04.03.2016, 16:01 | |||
|
В гугле так и не смог найти ответ на вопрос, зачем требуется уникальность адреса объекта. На это свойство многие ссылаются, но нигде не объясняется, ради чего это нужно. Вот, например, цитата с одного из форумов
Тут заглянули в Страуструпа, даже там написано только то, что разные объекты должны иметь разные адреса, а зачем - хз. Вообще при таком раскладе возникает сильное подозрение, что это борьба с каким-то из косяков языка или библиотеки, но с чем именно, соображений никаких нет. Возможно, что если мы построим массив из пустых структур, отдадим в какой-то из контейнеров, в котором есть деление на sizeof одного элемента, то будет деление на ноль, но я себе не представляю такой контейнер (шаблон) В общем, вопрос довольно-таки мутный Добавлено через 1 минуту
1
|
|||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
||||
| 04.03.2016, 16:06 | ||||
Сообщение было отмечено rikimaru2013 как решение
Решение2) Ну и что ты там вывел sizeof'ом? Ты думаешь, что размер класса? ![]()
4
|
||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 04.03.2016, 16:19 | |
|
0
|
|
|
|
|
| 04.03.2016, 16:30 | |
|
С любителями цепляться к формулировкам я обычно не спорю
Если ТС'а удовлетворяет ответ "1 байт, потому что так написано в стандарте" - значит ему этого достаточно. Лично мне было интересно копнуть глубже и понять, "а почему (ради чего) так в стандарте написано"
3
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 04.03.2016, 16:50 | |
|
Evg, вы любой спор и тему сводите к своему СИ коду. Не надо так.
1
|
|
|
Комп_Оратор)
|
||||||||
| 04.03.2016, 17:13 | ||||||||
|
ct0r, размер есть только у экземпляра, это верно. Но Evg, говорит всегда вещи, о которых очень интересно думать. Дело в том, что тип может определяться вместе с экземпляром и это даёт очень странные синтаксические возможности. То есть, возможность появления имени тега параметром в функции sizeof, это вещь удивительная. Вообще, теговые определения, это штука забавная, хотя и забытая.
В частности, возможность локального определения типов и даже функций, это вещь о которой не все знают.
![]() Добавлено через 7 минут ![]() Хотя спор это полезная вещь если личная амбиция не выше желания понять оппонента. Иногда речь идёт о противоречивых понятиях и несмотря на устоявшееся мнение, рассуждение о таких вещах может быть полезно. Именно это расширяет понимание. Мне тоже интересно.
0
|
||||||||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 04.03.2016, 17:19 | |
|
IGPIGP, просто тяжело глазам видить, что любое событие в С++ человек пытается объяснить на основе СИ кода. Давайте сразу на PHP.
Я не против, просто режит вечно слух: "В С++ так, а СИ вообще так". "Вот в С++ есть такое, а СИ ему замена это". Два языка идут в 21 веке своей жизнью отдельно.
0
|
|
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 04.03.2016, 17:37 | |
|
Kastaneda, я погарячился с PHP, прошу прощение Evg . А так я про СИ теги и коды при каждом случаи в С++ разделе. С новой философией "Modern C++", что вводят сейчас Страуструп и КО - думаю к СИ методам будут прибегать только в высоконагруженных местах.
0
|
|
| 04.03.2016, 17:37 | |
|
Помогаю со студенческими работами здесь
20
Почему не выделяется дополнительная память для приложения При сохранении выделяется только 512 байт на файл Почему при создании пустого проекта не открывается окно для написания кода? Visual Studio 2010 При попытке создать динамический одномерный массив, под него выделяется только 8 байт памяти
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|