【发布时间】:2020-01-20 10:31:56
【问题描述】:
我正在开发一个 RAM 非常紧张的嵌入式应用程序。 为此,我需要创建一个 24 位无符号整数数据类型。我正在使用结构来执行此操作:
typedef struct
{
uint32_t v : 24;
} uint24_t;
但是,当我询问这种类型的变量的大小时,它返回“4”,即:
uint24_t x;
x.v = 0;
printf("Size = %u", sizeof(x));
有没有办法强制这个变量有 3 个字节?
最初我认为这是因为它强制数据类型是字对齐的,但我可以这样做:
typedef struct
{
uint8_t blah[3];
} mytype;
在这种情况下,大小为 3。
【问题讨论】:
-
我不确定这是否会为您节省 RAM。 CPU 很可能是 32 位的,因此变量的每个地址通常仍然是 4 字节对齐的。
-
如果是 24 位变量数组就不行,对吧?
-
如果你想要一个数组,你可以使用
uint8_t并自己计算索引和打包/解包。 -
@bgarrood,数组元素在内存中是连续布局的,是的,所以如果你可以创建一个 24 位类型,那么以它作为元素类型的数组不能让所有元素在 32- 上对齐位边界。这是您的实现可能不提供定义 24 位类型的方法的一个很好的理由。但话又说回来,它可能。