簡體   English   中英

在C中使用32位整數的未使用內存

[英]unused memory using 32 bit integer in C

我有以下整數結構(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?

我將使用unsigned char ,這正是您所需要的。 喜歡

#ifndef BYTE
#define BYTE unsigned char
#endif

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

但是要回答您的問題-是的,它的確會將每個字段的字節數減少為1。

無論如何, 由於@JimBuck的評論 ,由於對齊(但是這些是細節,並且完全是特定於平台的),該結構可能具有4B的大小。

對,那是正確的。 第二種解決方案將本質上將結構分解為單個整數,每個成員具有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”。 但正如其他人所建議的那樣,最好使用8bits附帶的數據類型ergo: unsigned char

整數是32位-> 4個字節。 我會改用unsigned char,它只有1個字節,包含值0-255。

使用typedef為類型定義新名稱可以使其更方便使用。

typedef unsigned char t_byte;

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

Unsigned int仍然是相同大小,您想要unsigned char

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

但是,您應該記住,該標准並沒有強制要求它們不更大-它們無論如何都可能更大。 您可能需要使用打包的編譯指示來獲得所需的精確對齊。

您也可以使用unsigned char rgb[3]

在第一個樣本中,每個顏色分量分配4個字節。 對於8位顏色,應使用無符號char分配僅一個字節。 這里不需要位域。

請注意,您在此處定義了24位像素。 如果使用32位像素,則可能需要添加填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM