неиспользуемая память, использующая 32-битное целое число в C - PullRequest
1 голос
/ 20 ноября 2011

У меня есть следующая структура целых чисел (32-битная среда):

struct rgb {
    int r;
    int g;
    int b;
};

Правильно ли я сказал, что, поскольку для значений компонента rgb (0-255) требуется только 8 бит (1 байт), я использую только 1 байт памяти и оставляю 3 байта неиспользованными для каждого компонента?

Кроме того, если бы я вместо этого сделал следующее:

struct rgb{
    unsigned int r:8;
    unsigned int g:8;
    unsigned int b:8;
};

Предполагая, что то, что я сказал выше, верно, уменьшит ли использование этой новой структуры количество неиспользуемых байтов до 1?

Ответы [ 5 ]

5 голосов
/ 20 ноября 2011

Я бы использовал unsigned char, это именно то, что вам нужно. Нравится

#ifndef BYTE
#define BYTE unsigned char
#endif

struct rgb
{
    BYTE r;
    BYTE g;
    BYTE b;
};

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

В любом случае, структура, вероятно, будет иметь размер 4B из-за выравнивания (но это детали, и это полностью зависит от платформы) удалено, благодаря комментарию @ JimBuck

3 голосов
/ 20 ноября 2011

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

#include "stdio.h"

struct rgb{
    unsigned int r:8;
    unsigned int g:8;
    unsigned int b:8;
};

int main(void) {
        printf("Size of RGB: %d", sizeof(struct rgb));
        return 0;
}

Будет выведено: «Размер RGB: 4». Но, как другие предположили, будет лучше использовать тип данных, который идет с 8 битами, следовательно: unsigned char.

2 голосов
/ 20 ноября 2011

Целые числа - 32 бита -> 4 байта. Вместо этого я бы использовал unsigned char, который составляет всего 1 байт, содержащий значения 0-255.

Использование typedef для определения нового имени для типа делает его более удобным для использования.

typedef unsigned char t_byte;

struct rgb {
    t_byte r;
    t_byte g;
    t_byte b;
};
1 голос
/ 20 ноября 2011

В первом примере вы выделяете 4 байта для каждого компонента цвета.Для 8-битного цвета вы должны выделить только один байт, используя unsigned char.Здесь нет необходимости в битовых полях.

Обратите внимание, что здесь вы определили 24-битный пиксель.Возможно, вам придется добавить отступы, если вы используете 32-битные пиксели.

1 голос
/ 20 ноября 2011

Unsigned int все еще того же размера, вы хотите unsigned char

struct rgb{
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

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

Вы также можете использовать unsigned char rgb[3]

...