欺骗C编译器将整个结构分配为零,没有for循环[重复]
Posted
技术标签:
【中文标题】欺骗C编译器将整个结构分配为零,没有for循环[重复]【英文标题】:Trick C-compiler to assign whole struct to zero, without for-loop [duplicate] 【发布时间】:2014-01-11 03:10:12 【问题描述】:我目前正在编写嵌入式操作系统的一小部分,有时我需要将大型结构中的所有变量分配为 0。元素范围从 uint8 到 uint64。 到目前为止,我唯一要做的就是循环遍历每种类型的变量,将它们中的每一个都分配给 0,但这需要很多循环并且代码“丑陋”。 我在想是否可以创建一个结构类型的指针,然后将指向元素的值分配给 0,因为该元素的大小应该是 sizeof(MyStruct)?
分配给 0 的结构体:
struct AMD64Context
uint8_t fp_context[512] __attribute__((alligned(16)));
uint64_t rax;
....
....
;
【问题讨论】:
不管你怎么做,总会有一个循环...... 这是一个在你的编译器上玩的好技巧。对它说:“嘿,下面是什么?” 【参考方案1】:两个“经典”方法:
memset
AMD64Contex context;
memset(&context, 0, sizeof(context));
用0
初始化
AMD64Contex context=0;
请注意,结果略有不同:在第一种情况下,您将所有内存都归零,这保证了所有积分字段都为零,并且可能存在的任何填充也被归零。对于 FP 值,标准不保证归零(但无论如何在任何“正常”平台上都是如此;此外,由于您正在编写操作系统,您肯定知道在您的平台上“全零”FP 值是否实际上为零) .
第二个保证将字段归零,但它是否会影响填充是未指定的。如果您对填充的值不感兴趣,您可能应该使用这个 - 它更简洁,编译器更清楚其意图是什么(因此它可能会更好地优化它)。
【讨论】:
也许我应该提到,我在使用 C99 编译器的环境中进行编程,它不支持 memset/memcpy。但是在线程***.com/questions/6891720/… 中,有人用一种兼容的类型转换方法进行了回答:mystruct = (struct x)0; @Orpedo:什么样的环境没有memcpy
?
@Orpedo:你确实记得#include <string.h>
,对吧?
@Orpedo:这完全等同于我的“第二种方法”——该语法创建一个临时归零对象并将其分配给目标;在这里,我假设您想要初始化一个新的 struct
,以重置您想要在另一个问题中找到的语法的现有实例。
编写你自己的 memset - 这很容易。以上是关于欺骗C编译器将整个结构分配为零,没有for循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章