我有一个结构:

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;

最佳答案

首先,您应该确保这是您需要做的优化-做得不正确,您可能会遇到有关对齐,字节顺序等问题。因此,您将需要使用探查器来检查代码性能,并确定这是否是消耗大量处理器时间的 Realm 之一。记住what Donald Knuth wrote:



一旦确认这是一个有用的优化,那么您应该可以通过几种方式做到这一点。其中之一是使用memcpy ...

memcpy(&foo1, &a, sizeof(foo1));

或者,您可以使用foo1成员将union设置为uint16_t类型,然后将其写入...
union {
    struct foo f;
    uint16_t u;
} foo1;
foo1.u = a;

关于c++ - 如何写入为结构保留的内存位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44145983/

10-13 02:44