编译器优化与优化增量
编译器优化是否会导致这样的代码出现问题?具体来说,可以回复自动增量以按正确的顺序进行评估吗?
uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];
Does compiler optimization cause a problem with code like this? Specifically, can the auto-increments be replied upon to evaulate in the correct order?
uint result = (array[i++] << 16) | (array[i++] << 8) | array[i++];
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
是;这是指定的。
规范说:
Yes; this is specified.
The spec says:
不,我认为您在序列点之间多次修改对象 (i)。 IIRC 按位或或数组索引都不是序列点。您只能修改该对象一次,否则是未指定或未定义的行为。
笔记。这不一定是优化器的问题,只是不合法。
编辑:这是关于序列点的链接 - http://msdn .microsoft.com/en-us/library/d45c7a5d(VS.80).aspx
No, I think you're modifying the object (i) multiple times between sequence points. IIRC neither bitwise or, nor array indexing are sequence points. You are only allowed to modify the object once, doing otherwise is unspecified or undefined behaviour.
NOTE. This is not necessarily an issue to do with the optimizer, it's just not legal.
Edit: Here's a link on sequence points - http://msdn.microsoft.com/en-us/library/d45c7a5d(VS.80).aspx