Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
#1

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

29.12.2014, 15:37. Просмотров 851. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Странность определения размера памяти структуры (C++):

Подсчет размера структуры - C++
Доброго времени суток! Есть программа, написанная с применением структуры. Нужно посчитать размер этой структуры. Куда и как надо добавить...

Безуспешное освобождение памяти большого размера - C++
Добрый день! При попытках удаления указателя на память большого размера (грубо, свыше 50 МБ), программа вылетает. Т.е. при...

Поля структуры в памяти - C++
Приветствую всех!!! Интересует следующий вопрос: есть какая нибудь любая структура, например: struct my_struct { int number; ...

Указатели; Определение размера памяти и тому подобное - C++
Определить все известные типы данных применительно к переменным и их указателям; используя только указатели, определить значение присваемых...

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

Степень двойки для отражения размера памяти - C++
Коллеги глупый но все же интересный вопрос! Один гибибайт состоит из 1073741824 байт памяти. Почему разработчики выбрали такое странное...

39
rikimaru2013
C++ Game Dev
2471 / 1140 / 241
Регистрация: 30.11.2013
Сообщений: 3,709
29.12.2014, 15:48 #2
Структуры: выравнивание и заполнение (alignment and padding)
1
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 16:06  [ТС] #3
Супер...и это нельзя обойти? Просто относительное положение элементов структуры и её размер довольно принципиальны...
0
CheshireCat
Эксперт С++
2907 / 1256 / 81
Регистрация: 27.05.2008
Сообщений: 3,449
29.12.2014, 16:13 #4
Читай про #pragma pack: http://msdn.microsoft.com/en-us/library/aa273913%28v=vs.60%29.aspx
1
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 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 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 16:14  [ТС] #6
Видится мне, что стоит плюнуть на плюсы...Спасибо за столь быстрый ответ.
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
29.12.2014, 16:16 #7
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Видится мне, что стоит плюнуть на плюсы...
У всех языков программирования есть свои скелеты в шкафу...
0
Retyrn0
45 / 45 / 3
Регистрация: 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
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
29.12.2014, 16:22 #9
Можно поинетрисовать почему для вас так важен порядок?
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 16:36  [ТС] #10
Цитата Сообщение от Ilot Посмотреть сообщение
Можно поинетрисовать почему для вас так важен порядок?
Конечно. У меня структура пишется в файл. В примере я не описал, что ещё есть 2 текстовых поля. Перед каждым стоит 32-битное число - количество имволов, относящихся к тексту. Считываем размер, потом считываем количество байт, равное этому размеру. Потом ещё данные и 2-й раз то-же самое со 2-м текстовым полем.
Сделано это по 2-м причинам: 1 - быстрее, так как не нужно считывать по байту, пока не найдём NULL и выделять память из кучи, зная сколько точно понадобиться байт - проще, чем 1 раз пробежать до NULL со счётчиком, потом выделить память по результату счётчика и только потом вторым проходом считывания непосредственно считать данные.
0
Ilot
Эксперт С++
1826 / 1184 / 232
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
29.12.2014, 16:41 #11
В таком случае должен вас расстроить - порядок полей структуры не важен. Как я понимаю текстовые поля у вас фиксированной длины. Будет лучше убрать из структуры количество символов в этих строках и выделять память после чтения информации во временную структуру.
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 17:53  [ТС] #12
Цитата Сообщение от Ilot Посмотреть сообщение
Как я понимаю текстовые поля у вас фиксированной длины.
Тогда не имело бы смысла писать размер вообще. А так размер текстового поля может варьироваться от мин до макс.

Добавлено через 5 минут
Цитата Сообщение от Ilot Посмотреть сообщение
Будет лучше убрать из структуры количество символов в этих строках и выделять память после чтения информации во временную структуру.
Не совсем понял...таких структур в файле может быть миллиард. Хранить в оперативной памяти все размеры - не вариант. Каждый экземпляр в файле может иметь разный размер - мне точно не обойтись без размера, предваряющего сам текст. Второй вариант - NULL символ в конце текста, но я уже описал чем он хуже.
0
nmcf
6196 / 5507 / 1929
Регистрация: 14.04.2014
Сообщений: 23,118
29.12.2014, 17:58 #13
Можно же запретить выравнивание как писали выше, чем тебя не устроило?
0
Retyrn0
45 / 45 / 3
Регистрация: 24.06.2013
Сообщений: 677
Завершенные тесты: 1
29.12.2014, 18:14  [ТС] #14
Цитата Сообщение от nmcf Посмотреть сообщение
Можно же запретить выравнивание как писали выше, чем тебя не устроило?
Прошу прощения, не заметил)
Говорят, это замедляет процесс обработки...не быстрее будет работать с отдельными элементами?
0
nmcf
6196 / 5507 / 1929
Регистрация: 14.04.2014
Сообщений: 23,118
29.12.2014, 18:33 #15
Смотря какая у тебя задача. Я не думаю, что на современных компьютерах будет заметна разница. Ну если только объёмы данных очень большие.
0
29.12.2014, 18:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2014, 18:33
Привет! Вот еще темы с ответами:

Оформить в виде структуры год, месяц, число. Описать функцию для определения дня недели - C++
Оформить в виде структуры год, месяц, число. Описать функцию для определения дня недели, на который приходится заданная дата (учесть, что...

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

Структуры и динамическое выделение памяти. - C++
Привет, нужна помощь: есть написанная программа, которая работает со структурами, эту программу надо переписать так, чтобы она использовала...

Очистка памяти из под структуры - C++
Здравствуйте, имеется задача очистить память из под структуры, код программы struct Node { int data; }; void f() { Node*...


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

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

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