c++ - 这个 operator[] 函数的实现是如何工作的?

标签 c++ vector 3d game-engine

我正在读一本书(Eric Lengyel 的游戏引擎开发基础),这本书正在用 C++ 编写一些 vector 操作,这里是片段:

struct Vector3D
{
    float x, y, z;

    Vector3D() = default;

    Vector3D(float a, float b, float c)
    {
        x = a;
        y = b;
        z = c;
    }

    float& operator [](int i)
    {
        return((&x)[i]);
    }
};

我特别关心这篇文章:

float& operator [](int i)
{
    return((&x)[i]);
}

现在我希望这段代码返回 x,无论输入什么索引。但是,根据输入输出相应的变量(x、y 或 z)。为什么是这样?感谢您的帮助。

最佳答案

一会儿,让我们忽略函数实现方式的难闻气味。

问题是,它是如何工作的?

如果您查看类对象的成员变量,当成员之间没有填充时,它们在内存中的布局如下:

+-----+-----+-----+
|  x  |  y  |  z  |
+-----+-----+-----+

使用这样的布局,对象看起来就像是一个 float 数组。

如果您使用:

float* ptr = &x;

ptr 指向此类数组的第一个元素。

ptr[0] 计算数组的第一个元素,与 x 相同。
ptr[1] 计算为数组的第二个元素,与 y 相同。
ptr[2] 的计算结果为数组的第三个元素,与 z 相同。

这就是为什么

return((&x)[i]);

大部分时间都能正常工作,即使根据标准,此类代码会导致未定义的行为。

关于c++ - 这个 operator[] 函数的实现是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48031228/

相关文章:

c++ - 为什么 linux 在分配动态内存时会占用一些额外的空间?

c++ - 求模拟粒子轨迹的3D点和 vector 几何C++库

c++ - 将浮点 vector 转换为 double

c++ - 指针元素删除 vector

javascript - 使用鼠标围绕中心旋转 Three.js 相机

c++ - const 函数可以调用局部对象上的非常量函数吗?

c++ - 误解了析构函数的工作原理?

c++:在 switch 中使用 std::pair 的可能性

algorithm - 计算角速度

java - 通过矩阵平移 vector