【发布时间】:2016-06-29 03:00:52
【问题描述】:
struct Vec
{
double x, y, z;
};
Vec vec;
vec.x = 1.0;
vec.y = 2.0;
vec.z = 3.0;
double res = (&vec.x)[2]; // (&vec.x)[2] should be equal to vec.z
变量 res 的值应该等于 3。但是当我打开优化时,编译器会错误地重新排序指令并且 res 包含一些垃圾。一些可能的重新排序示例:
vec.x = 1.0;
vec.y = 2.0;
vec.z = 3.0;
res = (&vec.x)[2]; // correct value
vec.x = 1.0;
vec.y = 2.0;
res = (&vec.x)[2]; // incorrect value
vec.z = 3.0;
vec.x = 1.0;
res = (&vec.x)[2]; // incorrect value
vec.y = 2.0;
vec.z = 3.0;
这是编译器中的错误吗?还是不允许这样访问struct数据成员?
编辑:
我刚刚意识到前面的代码确实有效,对此感到抱歉。但这不起作用:
Vec vec;
vec.x = 1.0;
vec.y = 2.0;
vec.z = 3.0;
double res = (&vec.x)[i]; // (&vec.x)[i] should be equal to vec.z when i == 2
当编译时不知道变量i时,编译器会错误地重新排序指令。
【问题讨论】:
-
@BatCoder:如果是未定义的行为,是否可以重现并不重要。
-
Javers,
(&vec.x)[2]是什么意思,你怎么理解这个? -
(&vec.x)[2] 获取 vec.x 的地址,添加 2 并取消引用它。它应该返回 vec.z 的值
-
如果您想要类似数组的行为,您应该重载结构的下标运算符(即 operator[]),而不是尝试以无法合法使用的方式使用指针运算。见:learncpp.com/cpp-tutorial/98-overloading-the-subscript-operator
-
原始代码使用 operator[] 做同样的事情——它返回 (&x)[i]
标签: c++ optimization