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

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

Войти
Регистрация
Восстановить пароль
 
GoldenId
126 / 124 / 32
Регистрация: 11.11.2010
Сообщений: 694
Записей в блоге: 13
Завершенные тесты: 1
#1

компоновка полей struct в памяти - C++

11.11.2010, 06:08. Просмотров 858. Ответов 1
Метки нет (Все метки)

Подскажите ленивому тупому, которому лень Страустрапа почитать, как компонуются поля структуры в памяти?
Меня интересует конкретный пример.
Есть библиотечная структура
C++
1
2
3
4
5
struct SLib {
   float field1;
   DWORD field2;
   // ...
};
Мне нужно дополнить её другими данными
C++
1
2
3
int field3;
short field4;
// ...
Если я сделаю это так:
1)
C++
1
2
3
4
5
6
7
8
struct SMy {
   float field1;
   DWORD field2;
   // ...
   int field3;
   short field4;
   // ...
};
или так
2)
C++
1
2
3
4
5
6
struct SMy {
   SLib lib;
   int field3;
   short field4;
   // ...
};
могу ли я быть уверен, что
"Никогда-никогда,
никогда-никогда..." (с) с порядком расположения её полей в памяти ничего не произойдёт и я, например, смогу также зачитывать из битовых файлов в void* и заполнять её memcpy?

Заранее благодарен за конструктивные ответы.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2010, 06:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос компоновка полей struct в памяти (C++):

Количество памяти на union и struct - C++
struct MyStruct{ int i; char j; }; union Packed{ int i; char j; }; int _tmain(int argc, _TCHAR* argv) {

Расположение полей структуры в памяти - C++
Нифига себе на что плюсы способны... #include "stdafx.h" #include <time.h> #include <stdlib.h> #include <iostream> using...

Расположение полей структуры в памяти - C++
Есть структура MyStruct содержащая в себе два поля int. Есть массив объектов MyStruct. Гарантируется ли что поля MyStruct будут расположены...

Компоновка - C++
Я недавно начал изучать язык по книге Дейтелов, и у меня есть вопрос по компоновке программы, а точнее по картинке...

Компоновка хедеров - C++
Собственно вот такая проблема. Есть два файла first.h; second.h; каждый из них #include "vector.h"; И есть ещё файл tester.h; ...

компоновка программ - C++
Вопрос собственно про сборку программ из хидеров и сишников. Не понятно пока, если мы можем описывать классы в ашниках, то почему всю...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,370
11.11.2010, 08:54 #2
Не можешь.
Причин тут две:
1. У всех известных мне современных компиляторов C и С++ существует такая фича, как выравнивание (alignment) данных - и полей структур в том числе. При этом, для различных компиляторов это выравнивание может оказаться разным, - т.е. если твоя программа была скомпилирована Компилятором1, и записала структуру в файл как raw data (просто поток байтов), а потом перекомпилирована другим Компилятором2, и попыталась прочесть все те же данные, - ты можешь получить верные данные, а можешь получить бред....... Потому что выравнивание может оказаться разным, а может одинаковым, - как карта ляжет.
Можно победить, насильственно указав компилятору желаемое выравнивание:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#pragma pack(push, 1)
 
struct SMy {
   float field1;
   DWORD field2;
   // ...
   int field3;
   short field4;
   // ...
};
 
#pragma pack(pop)
(в твоем конкретном компиляторе прагма может быть немного иной, но суть та же.... Читай документацию к компилятору.)

2. Существует еще такая штука, как архитектуры big-endian и little-endian - попросту говоря, различный порядок байтов в многобайтовых переменных (int, etc...). Так вот, для различных процессоров этот порядок лехко может оказаться разным, и при переносе файла данных между различными машинами (по сети, или еще каким-то способом....) ты гарантированно получишь бред.

А так - да, если программа компилируется одним и тем же компилятором, с одними и теми же опциями, и гарантированно работает на машинах одной и той же архитектуры, - да, можешь быть уверен. Компилятор не будет самовольно переставлять поля структур, их последовательность в памяти будет всегда одной и той же.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2010, 08:54
Привет! Вот еще темы с ответами:

Динамическая компоновка в QNX - C++
Здравствуйте! Мне нужно написать какую-нибудь программу на C++, связанную с динамической компоновкой в QNX Neutrino. Программа нужна для...

Внутренняя компоновка с модификатором const - C++
Привет. Читаю Страуструпа "Язык программирования С++". Глава 9: Я не понимаю как используются эти 2 файла (file1.c & file2.c) в...

Компоновка MFC с OCX-файлом - C++
Доброе время суток! Намедни я столкнулся с проблемой регистрации OCX'а. По совету Boombastic'а я сделал релизный конфиг активным и от...

Компоновка всей программы в один файл - C++
Можно ли сделать так, чтоб при построение программы она, включая все внешние картинки, звуковые файлы, редистрюбитивы VC и пр компоновались...


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

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

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