我有一个结构体:
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;发布于 2017-05-24 06:25:06
首先,你应该确保这是一个你需要做的优化--如果做得不正确,你可能会遇到关于对齐、字节排序等的问题。因此,你需要使用分析器来检查代码性能,并确定这是否是消耗大量处理器时间的领域之一。记住what Donald Knuth wrote
程序员浪费了大量的时间去考虑或担心程序中非关键部分的速度,当考虑到调试和维护时,这些追求效率的尝试实际上会产生很大的负面影响。我们应该忘记小的效率,比如说97%的时间:过早的优化是一切邪恶的根源。然而,我们不应该错过这关键的3%的机会。
一旦您确认这是一个有用的优化,那么您应该能够通过以下几种方式进行优化。其中之一是使用memcpy...
memcpy(&foo1, &a, sizeof(foo1));或者,您可以将foo1设置为具有uint16_t成员的union类型,并将其写入...
union {
struct foo f;
uint16_t u;
} foo1;
foo1.u = a;https://stackoverflow.com/questions/44145983
复制相似问题