【发布时间】:2009-06-08 11:50:14
【问题描述】:
我有大量这样的 C 结构实例:
struct mystruct
{
/* ... */
unsigned flag: 1;
/* ... */
};
-
flag最初为 0,但在退出某个函数时必须为 1。
最简单的实现是:
void set_flag(struct mystruct *sp)
{
sp->flag = 1U;
}
但是这样做对性能的可能影响是什么:
void set_flag(struct mystruct *sp)
{
if (sp->flag == 0U)
{
sp->flag = 1U;
}
}
我希望避免写入主内存。第一个版本总是进行写操作,第二个版本只有在未设置标志时才执行写操作,但在绝大多数情况下,标志已经被设置了。
还有哪些其他因素(例如分支预测)可能会影响性能?
到目前为止,我已经看到了速度的小幅提升,我希望随着数据集变得更大,它会变得更加显着。
对于大型数据集,此更改是否存在使程序变慢的风险,如果是,在什么情况下可能会发生这种情况?
【问题讨论】:
-
只是出于兴趣,您对上述内容的最终结论是什么?
标签: c optimization bit-fields