首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何写入为struct保留的内存位置

如何写入为struct保留的内存位置
EN

Stack Overflow用户
提问于 2017-05-24 06:20:45
回答 1查看 181关注 0票数 1

我有一个结构体:

代码语言:javascript
复制
struct foo{
  uint8_t i1 : 4;
  uint8_t i2 : 4;
  uint8_t i3 : 4;
  uint8_t i4 : 4;
}

现在,我有一个16位的整数(称之为a),我希望将它写入此结构的内存位置,而不必这样做:

代码语言:javascript
复制
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的内存位置。类似于:

代码语言:javascript
复制
*(*uint16_t)&foo1 = a;
EN

回答 1

Stack Overflow用户

发布于 2017-05-24 06:25:06

首先,你应该确保这是一个你需要做的优化--如果做得不正确,你可能会遇到关于对齐、字节排序等的问题。因此,你需要使用分析器来检查代码性能,并确定这是否是消耗大量处理器时间的领域之一。记住what Donald Knuth wrote

程序员浪费了大量的时间去考虑或担心程序中非关键部分的速度,当考虑到调试和维护时,这些追求效率的尝试实际上会产生很大的负面影响。我们应该忘记小的效率,比如说97%的时间:过早的优化是一切邪恶的根源。然而,我们不应该错过这关键的3%的机会。

一旦您确认这是一个有用的优化,那么您应该能够通过以下几种方式进行优化。其中之一是使用memcpy...

代码语言:javascript
复制
memcpy(&foo1, &a, sizeof(foo1));

或者,您可以将foo1设置为具有uint16_t成员的union类型,并将其写入...

代码语言:javascript
复制
union {
    struct foo f;
    uint16_t u;
} foo1;
foo1.u = a;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44145983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档