我已经阅读了这个问题:How does casting uint8* to uint32* work?,但我不确定所给答案的正确性。
我是一个新手嵌入式C程序员,正在使用GCC开发项目,我一直在重构代码块以减少内存使用。例如,我改变了一些变量的数据类型,从
我是一个新手嵌入式C程序员,正在使用GCC开发项目,我一直在重构代码块以减少内存使用。例如,我改变了一些变量的数据类型,从
uint32_t
更改为更小的类型:uint8_t colour;
uint16_t count;
uint16_t pixel;
func((uint32_t*)&colour);
func((uint32_t*)&count);
func((uint32_t*)&pixel);
func(uint32_t* ptr)
函数会修改从从slave端口传入的数据,并将其存储在指针所指向的位置。但是当启用 -O1
, -O2
, -O3
或 -Os
优化选项时,上述代码不会按预期运行。例如,在串行通信端口上接收到值为 1
, 5
, 1
时,变量被设置的值分别为 0
, 0
, 1
。而在未启用任何优化选项时,变量的值被正确地设置。
如果将数据类型更改回uint32_t
,则代码将正常工作。我不明白为什么编译器没有发出任何警告(我已经开启了额外的警告)。这种问题是否与字节顺序和对齐方式有关?
从 uint8_t
指针向 uint32_t
指针升级的风险是什么?
func
在任何时候都会取消引用指针,则其行为是未定义的。 - Christian Gibbonsuint32_t array[1000];
并且_可以_转换为uint8_t array[1000];
。这是否值得代码复杂化? - Craig Estey-fstrict-aliasing
和-Wstrict-aliasing
,我也没有收到编译器警告,但现在我会进行更改。我更改代码的原因是尽可能地节省字节(该项目已经使用了7669/8192总内存)。 - NubcakePIC18F
)?它似乎已经有几十年历史了。这必须在传统硬件上工作还是用一些更大内存的新CPU来制作未来产品?CPU制造商停止生产芯片前还有多久?树莓派售价$25-35,带有千兆字节的RAM。因此我们至少应该有64KB RAM,这是1985年左右就已经存在的;-) - Craig Estey