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

Странности работы size_of()

23.12.2019, 19:48. Показов 1504. Ответов 11

Студворк — интернет-сервис помощи студентам
Прошу подсказать знающих людей, по какой причине при
C++
1
2
typedef struct { char* b=0; int s=0; } coder_t;
cout << sizeof(coder_t) << endl;
оператор возвращает 16.

А при возврате размера класса Coder
C++
1
2
Coder cd;
cout << sizeof(cd) << endl;
возвращается 12

Класс Coder:
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
struct Coder
{
    Coder() :m_buf(0), m_size(0) {}
 
    Coder& operator=(const Coder& cd);
 
    Coder(const Coder& cd);
 
    void set(const char* buf, int size);
    char* buf() const;
    int size() const;
 
    void encode();
    void decode();
 
    ~Coder()
    {
        delete[] m_buf;
    }
 
private:
    char* m_buf;
    int m_size;
};
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.12.2019, 19:48
Ответы с готовыми решениями:

Странности работы @picklist
Драсьте всем!!! Господа, срочно нужна Ваша помощь... Я всю голову сломал: @PickList по категориям на одном компе вываливает нужный...

Странности работы очереди
Всем привет. Вопрос по очередям и особенностям их использования. Есть таск №1, какой пишет в очередь. for(int i=0; i &lt;...

странности работы FT232
Определяется ставятся дрова, замыкаю RX TX эхо ловиться, подключаю МК(который делает эхо) после отправки байта старше 126 (0b01111110) в...

11
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
23.12.2019, 19:56
Clang и GCC у меня выводят оба раза по 16
0
1 / 1 / 0
Регистрация: 23.05.2019
Сообщений: 16
23.12.2019, 20:02
Про sizeof можешь забыть. Он показывает количество выделяемой памяти, а не размер.
0
0 / 0 / 0
Регистрация: 19.04.2019
Сообщений: 15
23.12.2019, 20:03  [ТС]
Странно, у меня что на VS компиляторе что на g++ значения разные. При чем если в Coder добавить еще одно поле int то тогда класс становиться размером 16...
С чем может быть связано данное поведение
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
23.12.2019, 20:03
Вроде как так и должно быть на 64 битной машине. 8 байт указатель (выравнивается по 8 битной границе), int 4 байта (по 4-х битной границе ) и смещение padding 4 возьмёт
0
0 / 0 / 0
Регистрация: 19.04.2019
Сообщений: 15
23.12.2019, 20:04  [ТС]
да я это понимаю, но почему происходит различное выделение?
0
Эксперт С++
1624 / 954 / 782
Регистрация: 06.02.2016
Сообщений: 2,452
Записей в блоге: 31
23.12.2019, 20:10
Цитата Сообщение от Peoples Посмотреть сообщение
padding
Заполняет пустоту между 8 и 4 байтовыми границами памяти
0
0 / 0 / 0
Регистрация: 19.04.2019
Сообщений: 15
23.12.2019, 20:15  [ТС]
Хорошо, как же мне тогда добиться того что бы возвращаемое значение оператора size_of было одинаковым? Кроме как добавлять еще одно поле int в Coder
0
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
23.12.2019, 20:31
Mochola, ищи, где в коде или настройках проекта игрался с выравниванием Ну, ещё полный принудительный ребилд не помешает для начала

Цитата Сообщение от Givikap120 Посмотреть сообщение
sizeof ... показывает количество выделяемой памяти, а не размер.
новый стандарт? о_О
1
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
23.12.2019, 20:53
Mochola,
чтобы спать спокойно, вот испытайте:
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
#include <iostream>
 
#pragma pack(push, 1)
typedef struct { char* b=0; int s=0; } coder_t;
struct Coder
{
    Coder() :m_buf(0), m_size(0) {}
 
    Coder& operator=(const Coder& cd);
 
    Coder(const Coder& cd);
 
    void set(const char* buf, int size);
    char* buf() const;
    int size() const;
 
    void encode();
    void decode();
 
    ~Coder()
    {
        delete[] m_buf;
    }
 
private:
    char* m_buf;
    int m_size;
};
#pragma pack(pop)
 
int main()
{   
    Coder cd;
    std::cout << sizeof(cd)      << std::endl;
    std::cout << sizeof(coder_t) << std::endl;
    
    std::cin.get();
    return 0;
}
1
фрилансер
 Аватар для Алексей1153
6465 / 5678 / 1131
Регистрация: 11.10.2019
Сообщений: 15,118
23.12.2019, 20:56
XLAT, с дефолтным выравниванием тоже должно совпадать в обоих случаях. Там нужно разобраться - либо компилятор глюкнул, либо разное выравнивание в разных файлах. Нужно чинить, а то будут сюрпризы
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,237
23.12.2019, 21:59
Лучший ответ Сообщение было отмечено Mochola как решение

Решение

Цитата Сообщение от Mochola Посмотреть сообщение
Хорошо, как же мне тогда добиться того что бы возвращаемое значение оператора size_of было одинаковым? Кроме как добавлять еще одно поле int в Coder
Во-первых, sizeof, а не size_of()

Вы компилируете два разных файла с разными настройками выравнивания. С настройками выравнивания, которые вы сами сделали разными. Неудивительно, что размеры получаются разные. Перестаньте баловаться с настройками выравнивания без лишней на то необходимости, верните все настройки выравнивания обратно на место - и все будет одинаковым.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.12.2019, 21:59
Помогаю со студенческими работами здесь

Странности работы системы
Всем привет, возникла такая проблема у меня материнская плата asus p5kr, процессор xeon e5450 в разгоне до 3,7 ghz. И стояло 6 гиг ddr2 две...

Access 2007 странности работы
В Access 2007 не работает простой обработчик. При нажатии кнопочки из формы, в заданном поле Отчета должен записываться текст: stDocName...

Странности работы функции recv (winsock2)
Здравствуйте. Поисковик мне не помог, ничего похожего на форуме найти не удалось, поэтому - создам сам. Когда начинал писать сервер на...

Странности работы локальных сервисов в сети
Имеются рабочие компьютеры в домене без выхода в интернет, установлена windows 7х32pro, 2gb ram, core2duo E8400. Периодически раз в день...

После аварийного завершения работы, с Windows 10 начались странности
Добрый день, уважаемые пользователи. Случилось непонятное с моим компьютером. Я такое вижу впервые. Даже не знаю с чего начать...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru