Представление памяти float и int - PullRequest
2 голосов
/ 29 августа 2011
struct s
{
  int a;
  float b;
  int c;
}

Как члены этой структуры хранятся в ячейке памяти?Насколько я понимаю, когда структурная переменная выделяется, память для членов структуры также будет выделена.Если 1000 является начальным адресом, то a будет 1000, b будет 1004, а c будет 1008.

Целые числа и числа с плавающей точкой будут иметь разные адресные пространства в памяти.Как число с плавающей запятой и целое число объявлено внутри структуры, представленной в памяти?Пожалуйста, помогите мне понять.

Ответы [ 4 ]

3 голосов
/ 29 августа 2011

Предполагая sizeof(int) == sizeof(float) == 4 и что компилятор не решает добавить некоторые отступы, ваш ответ правильный. Я не знаю, что означает «у целых чисел и с плавающей точкой будут разные адресные пространства в памяти», поэтому я не уверен, что смогу ответить на ваш последний вопрос.

2 голосов
/ 29 августа 2011

Не имеет смысла говорить, что члены структуры выделяются одновременно со структурой.Структура - это просто коллекция его членов.В структуре нет никаких дополнительных данных, которые вы могли бы осмысленно сказать, что «структура была выделена, но не члены».

Как именно выделяется память, зависит от платформы и компилятора.Если, скажем, int и float имеют 4 байта - что я считаю типичным - тогда эта структура будет состоять из 12 байтов, три поля одно за другим.

Компиляторы иногда помещают всеполя в структуре на 4-байтовых границах или какой-либо другой границе.Таким образом, если у вас есть структура, состоящая из char, float и int, вы, вероятно, получите 1 байт для char, 3 байта-заполнителя, затем 4 для float и 4 для int.

Целые числа и числа с плавающей запятой НЕ имеют разных адресных пространств в памяти, по крайней мере, ни в одной системе, которую я когда-либо использовал.Они свободно смешиваются вместе.Процессор может иметь отдельные регистры int и float, но это совсем другое.

2 голосов
/ 29 августа 2011

Как члены этой структуры хранятся в ячейке памяти?Насколько я понимаю, когда структурная переменная выделяется, память для членов структуры также будет выделена.Если 1000 является начальным адресом, то a будет 1000 b и будет 1004. будет c 1008.

Поскольку размер типа int и даже float зависит от платформы, так же как и то, как структуры упаковываются / хранятся /выровненный / извлеченный в памяти, нет никакого платформо-нейтрального ответа на ваш вопрос.

Если вам важно, как структуры хранятся в памяти, вам нужно будет найти некоторые специфичные для компилятора способы, чтобы гарантировать, что структуры будутправильно упакованы и выровнены.Для gcc см. здесь , чтобы узнать, как использовать __attribute__ для управления упаковкой и выравниванием.Для MSVC смотрите здесь , чтобы узнать, как использовать pragma pack.

Конечно, ЗДЕСЬ БУДУТ ДРАКОНЫ:

Вы рискуете узнать о платформе, как данныехранится в памяти, yarr, есть много возможностей для ошибок, если вы берете этот кусок памяти и отправляете его на другое устройство.Чтобы предотвратить ошибки (и будут ошибки), имейте в виду:

0 голосов
/ 29 августа 2011

Вы можете использовать смещение макроса для получения смещения элемента структуры. Добавьте это смещение в структурный адрес, чтобы получить адрес члена.

typedef struct s {
  int a;
  float b;
  int c;
} s_t;

s_t var;

printf("var.c addresss=%p\n",((const uint8_t*)&var)+offsetof(s_t,c));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...