C++ C中使用32位整数的未使用内存
我有以下整数结构(32位环境): 我说的对吗?因为rgb组件值(0-255)只需要表示8位(1字节),所以我只使用了1字节的内存,每个组件没有使用3个字节 此外,如果我做了以下操作: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
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