我有一个结构:
struct foo{
uint8_t i1 : 4;
uint8_t i2 : 4;
uint8_t i3 : 4;
uint8_t i4 : 4;
}
现在,我有一个16位整数(称之为a),我想写入此结构的内存位置,而不必这样做:
foo1.i1 = (uint8_t)a>>12;
foo1.i2 = (uint8_t)a>>8;
foo1.i3 = (uint8_t)a>>4;
foo1.i4 = (uint8_t)a;
是否可以选择将16位写入foo1的存储单元。类似的东西:
*(*uint16_t)&foo1 = a;
答案 0 :(得分:2)
首先,你应该确保这是一个你需要做的优化 - 做错了,你可能遇到有关对齐,字节排序等问题。因此,你会想要使用一个分析器检查代码性能并确定这是否是占用大量处理器时间的区域之一。请记住what Donald Knuth wrote:
程序员浪费了大量时间来考虑或担心程序中非关键部分的速度,而这些效率尝试实际上在考虑调试和维护时会产生很大的负面影响。我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源。然而,我们不应该把这个关键的3%的机会放弃。
一旦你确认这是一个有用的优化,那么你应该能够以某种方式做到这一点。其中之一是使用memcpy
...
memcpy(&foo1, &a, sizeof(foo1));
或者,您可以使foo1
成员union
成为uint16_t
成员并写信给他...
union {
struct foo f;
uint16_t u;
} foo1;
foo1.u = a;