Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C中使用32位整数的未使用内存_C++_C_Integer_Packing - Fatal编程技术网

C++ C中使用32位整数的未使用内存

C++ C中使用32位整数的未使用内存,c++,c,integer,packing,C++,C,Integer,Packing,我有以下整数结构(32位环境): 我说的对吗?因为rgb组件值(0-255)只需要表示8位(1字节),所以我只使用了1字节的内存,每个组件没有使用3个字节 此外,如果我做了以下操作: struct rgb{ unsigned int r:8; unsigned int g:8; unsigned int b:8; }; 假设我上面所说的是正确的,使用这个新结构会将未使用的字节数减少到1吗?Unsigned int仍然是相同的大小,您想要Unsigned char str

我有以下整数结构(32位环境):

我说的对吗?因为rgb组件值(0-255)只需要表示8位(1字节),所以我只使用了1字节的内存,每个组件没有使用3个字节

此外,如果我做了以下操作:

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

假设我上面所说的是正确的,使用这个新结构会将未使用的字节数减少到1吗?

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

struct rgb{
    unsigned char r;
    unsigned char g;
    unsigned char b;
};
但是,您应该记住,标准并没有强制执行它们不是更大的——它们可能更大。您可能需要使用压缩pragma来精确地获得所需的对齐方式


您还可以使用
无符号字符rgb[3]

无符号int的大小仍然相同,您需要无符号字符

struct rgb{
    unsigned char r;
    unsigned char g;
    unsigned char b;
};
但是,您应该记住,标准并没有强制执行它们不是更大的——它们可能更大。您可能需要使用压缩pragma来精确地获得所需的对齐方式


您还可以在第一个示例中使用无符号字符rgb[3]

在每个颜色组件中分配4个字节。对于8位颜色,您应该使用无符号字符只分配一个字节。这里不需要位字段


请注意,此处定义了24位像素。如果使用32位像素,则可能需要添加填充。

在第一个示例中,为每个颜色组件分配4个字节。对于8位颜色,您应该使用无符号字符只分配一个字节。这里不需要位字段


请注意,此处定义了24位像素。如果使用32位像素,可能需要添加填充。

整数是32位->4字节。我将使用无符号字符,它只有1个字节,包含0-255的值

使用typedef为类型定义新名称使其使用更加方便

typedef unsigned char t_byte;

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

整数是32位->4字节。我将使用无符号字符,它只有1个字节,包含0-255的值

使用typedef为类型定义新名称使其使用更加方便

typedef unsigned char t_byte;

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

我会使用
无符号字符
,这正是您需要的。像

#ifndef BYTE
#define BYTE unsigned char
#endif

struct rgb
{
    BYTE r;
    BYTE g;
    BYTE b;
};
但是为了回答您的问题-是的,它确实将每个字段的字节数减少到1


无论如何,由于@JimBuck的注释,删除了对齐(但这些是细节,完全是平台特定的),结构的大小可能是4B,我将使用
unsigned char
,这正是您需要的。像

#ifndef BYTE
#define BYTE unsigned char
#endif

struct rgb
{
    BYTE r;
    BYTE g;
    BYTE b;
};
但是为了回答您的问题-是的,它确实将每个字段的字节数减少到1


无论如何,由于@JimBuck的评论是正确的,结构的大小可能是4B,因为对齐(但这些是细节,完全是平台特定的)被删除了。第二种解决方案实质上将结构分解为单个int,每个成员有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

是的,这是正确的。第二种解决方案实质上将结构分解为单个int,每个成员有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位的数据类型,因此:
无符号字符

实际上,不,在这种情况下,因为所有元素都是字符,所以不需要填充,因为它已经是字符对齐的,所以它将是一个3字节的结构。@JimBuck-whoops,我错过了“所有元素”的部分。你说得对,谢谢!:)@基里尔-几乎,虽然结构只有3个字节,但下一个对象将在32位上对齐,因此它真正使用4bytes@MartinBeckett-是的,我完全同意这一点。谢谢你的邀请note@MartinBeckett-这取决于“下一个对象”是什么。如果它是另一个
rgb
struct或其他基于字符的结构,它将被打包在
rgb
struct旁边。但是,更重要的是,如果你有一个
rgb
s数组(例如,在游戏中非常常见),它们将按照你希望的那样打包(tm)。实际上,不,在这种情况下,因为所有元素都是字符,所以不需要填充,因为它已经是字符对齐的,所以它将是一个3字节的结构。@JimBuck-whoops,我错过了“all elements”部分。你说得对,谢谢!:)@基里尔-几乎,虽然结构只有3个字节,但下一个对象将在32位上对齐,因此它真正使用4bytes@MartinBeckett-是的,我完全同意这一点。谢谢你的邀请note@MartinBeckett-这取决于“下一个对象”是什么。如果它是另一个
rgb
struct或其他基于字符的结构,它将被打包在
rgb
struct旁边。但是,更重要的是,如果你有一个
rgb
s数组(例如,在游戏中非常常见),它们会像你希望的那样打包(tm)。CIndeed中没有字节数据,没有。我暂时忘记了上下文,将其修复为
unsigned char
CIndeed中没有字节datatpe,没有。我暂时忘记了上下文,将其固定为
unsigned char