Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
#1

Странность определения размера памяти структуры

29.12.2014, 15:37. Просмотров 875. Ответов 39
Метки нет (Все метки)

Здравствуйте. Никогда с таким не сталкивался, а сейчас просто крышу снесло пока нашёл ошибку там, где не ожидал...

C++
1
struct STRUCT{INT32 size;INT64 x,y,z;INT32 h;};const INT32 sizeof_struct=sizeof(STRUCT);
В результате почему-то 40...
А вот так
C++
1
struct STRUCT{INT64 x,y,z;INT32 size,h;};const INT32 sizeof_struct=sizeof(STRUCT);
- вполне адекватные 32.

Кто может объяснить какого...выравнивание памяти что-ли? MSVS2008.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.12.2014, 15:37
Ответы с готовыми решениями:

Подсчет размера структуры
Доброго времени суток! Есть программа, написанная с применением структуры....

Выделение памяти переменного размера
Задача в следующем: Иметь возможность использовать блок памяти фиксированного...

Безуспешное освобождение памяти большого размера
Добрый день! При попытках удаления указателя на память большого размера...

Оформить в виде структуры год, месяц, число. Описать функцию для определения дня недели
Оформить в виде структуры год, месяц, число. Описать функцию для определения...

Структуры. Освобождение памяти
#include "stdafx.h" #include<iostream> using namespace std; struct Film {...

39
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
29.12.2014, 15:48 #2
Структуры: выравнивание и заполнение (alignment and padding)
1
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 16:06  [ТС] #3
Супер...и это нельзя обойти? Просто относительное положение элементов структуры и её размер довольно принципиальны...
0
CheshireCat
Эксперт С++
2912 / 1261 / 114
Регистрация: 27.05.2008
Сообщений: 3,464
29.12.2014, 16:13 #4
Читай про #pragma pack: http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx
1
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
29.12.2014, 16:13 #5
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Супер...и это нельзя обойти?
Можно:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
struct STRUCT{
    int32_t size;
    int32_t h;
    int64_t x,y,z;
};
const int32_t sizeof_struct=sizeof(STRUCT);
int main () {
    std::cout << sizeof_struct << std::endl;;
    return 0;
}
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 16:14  [ТС] #6
Видится мне, что стоит плюнуть на плюсы...Спасибо за столь быстрый ответ.
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
29.12.2014, 16:16 #7
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Видится мне, что стоит плюнуть на плюсы...
У всех языков программирования есть свои скелеты в шкафу...
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 16:21  [ТС] #8
Цитата Сообщение от Ilot Посмотреть сообщение
Можно:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
struct STRUCT{
    int32_t size;
    int32_t h;
    int64_t x,y,z;
};
const int32_t sizeof_struct=sizeof(STRUCT);
int main () {
    std::cout << sizeof_struct << std::endl;;
    return 0;
}
Я в вопросе описал, что так и поступил но порядок элементов в моём случае принципиален...

Добавлено через 1 минуту
Я не отказываюсь от плюсов в принципе, просто этот кусок кода реализую без них.
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
29.12.2014, 16:22 #9
Можно поинетрисовать почему для вас так важен порядок?
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 16:36  [ТС] #10
Цитата Сообщение от Ilot Посмотреть сообщение
Можно поинетрисовать почему для вас так важен порядок?
Конечно. У меня структура пишется в файл. В примере я не описал, что ещё есть 2 текстовых поля. Перед каждым стоит 32-битное число - количество имволов, относящихся к тексту. Считываем размер, потом считываем количество байт, равное этому размеру. Потом ещё данные и 2-й раз то-же самое со 2-м текстовым полем.
Сделано это по 2-м причинам: 1 - быстрее, так как не нужно считывать по байту, пока не найдём NULL и выделять память из кучи, зная сколько точно понадобиться байт - проще, чем 1 раз пробежать до NULL со счётчиком, потом выделить память по результату счётчика и только потом вторым проходом считывания непосредственно считать данные.
0
Ilot
Эксперт С++
1830 / 1188 / 342
Регистрация: 16.05.2013
Сообщений: 3,139
Записей в блоге: 5
Завершенные тесты: 1
29.12.2014, 16:41 #11
В таком случае должен вас расстроить - порядок полей структуры не важен. Как я понимаю текстовые поля у вас фиксированной длины. Будет лучше убрать из структуры количество символов в этих строках и выделять память после чтения информации во временную структуру.
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 17:53  [ТС] #12
Цитата Сообщение от Ilot Посмотреть сообщение
Как я понимаю текстовые поля у вас фиксированной длины.
Тогда не имело бы смысла писать размер вообще. А так размер текстового поля может варьироваться от мин до макс.

Добавлено через 5 минут
Цитата Сообщение от Ilot Посмотреть сообщение
Будет лучше убрать из структуры количество символов в этих строках и выделять память после чтения информации во временную структуру.
Не совсем понял...таких структур в файле может быть миллиард. Хранить в оперативной памяти все размеры - не вариант. Каждый экземпляр в файле может иметь разный размер - мне точно не обойтись без размера, предваряющего сам текст. Второй вариант - NULL символ в конце текста, но я уже описал чем он хуже.
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
29.12.2014, 17:58 #13
Можно же запретить выравнивание как писали выше, чем тебя не устроило?
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 18:14  [ТС] #14
Цитата Сообщение от nmcf Посмотреть сообщение
Можно же запретить выравнивание как писали выше, чем тебя не устроило?
Прошу прощения, не заметил)
Говорят, это замедляет процесс обработки...не быстрее будет работать с отдельными элементами?
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
29.12.2014, 18:33 #15
Смотря какая у тебя задача. Я не думаю, что на современных компьютерах будет заметна разница. Ну если только объёмы данных очень большие.
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 18:39  [ТС] #16
Цитата Сообщение от nmcf Посмотреть сообщение
если только объёмы данных очень большие
Вот именно)

Добавлено через 1 минуту
Поэтому необходима максимальная скорость. Поэтому отказался от стандарного NULL-терминального символа окончания строки в конце и заменил на предваряющий размер в начале - скорость приоритетна.

Добавлено через 1 минуту
Есть идея высоконагруженного сервера сообщений. Идея - не подкопаешься, а вот реализация с точки зрения программирования - куча неожиданностей.
0
nmcf
6271 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
29.12.2014, 18:41 #17
Как хранение длины связано с выравниванием?
О каких объёмах речь?
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 18:46  [ТС] #18
Цитата Сообщение от nmcf Посмотреть сообщение
Как хранение длины связано с выравниванием?
Для лучшей читабельности кода набор данных обёрнут в структуру. В том числе размер строки текста в байтах является полем структуры.
0
DrOffset
7962 / 4628 / 1125
Регистрация: 30.01.2014
Сообщений: 7,526
29.12.2014, 18:47 #19
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Говорят, это замедляет процесс обработки...
А никто с запакованными структурами и не работает. Их используют для считывания из канала или файла, а дальше полученные значения в нормальном выровненном виде используются.
Главная проблема отключения выравнивания не в "медленности", а в том, что на некоторых платформах вообще нельзя обращаться к невыровненным данным, получим аппаратное исключение (x86 к таковым не относится).

Почему бы просто не читать в массив байт блоками определенной длины, а потом не интерпретировать данные оттуда в соответствии с твоим протоколом?
0
Retyrn0
45 / 45 / 5
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 18:55  [ТС] #20
Цитата Сообщение от nmcf Посмотреть сообщение
О каких объёмах речь?
Высоконагруженный сервер сообщений. Всё зависит от количества пользователей - я не могу вот так сказать конкретную цифру. Пусть для фундаментальной определённости будет поток данных того же сервера сообщений ВКонтакта.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему бы просто не читать в массив байт блоками определенной длины
Заранее не определен размер поля данных...пусть сообщение может состоять из от 4 до 65536 байт. По сколько байт в блоке читать из файла?

Добавлено через 1 минуту
По 4 - минимальный размер. Но зачем, если можно сразу считать столько, сколько нужно исходя из первых 4 байт размера.

Добавлено через 3 минуты
А NULL - хрен его знает где встретится. Ну и на самом деле поле размера так же используется для других нужд(рамер поля со знаком минус считается удалённым).
0
29.12.2014, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2014, 18:55

Поля структуры в памяти
Приветствую всех!!! Интересует следующий вопрос: есть какая нибудь любая...

С++. Как правильно сохранять структуры разного размера в одном файле?
У меня есть структуры (struct) одного типа, но разного размера (длины строк в...

Определение размера памяти доступной для программы
Как можно определить в программе размер доступной памяти? Необходимо для...


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

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

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