gpt4 book ai didi

c++ - 重载 operator[] 从 1 开始和性能开销

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:31 26 4
gpt4 key购买 nike

我正在做一些 C++ 计算力学(不用担心,这里不需要物理知识),有些事情真的让我很困扰。

假设我想表示一个 3D 数学 vector (与 std::vector 无关):

class Vector {
public:
Vector(double x=0., double y=0., double z=0.) {
coordinates[0] = x;
coordinates[1] = y;
coordinates[2] = z;
}
private:
double coordinates[3];
};

到目前为止一切顺利。现在我可以重载 operator[] 来提取坐标:

double& Vector::operator[](int i) {
return coordinates[i] ;
}

所以我可以输入:

Vector V; 

… //complex computation with V

double x1 = V[0];
V[1] = coord2;

问题是,从 0 开始索引在这里是不自然的。我的意思是,在对数组进行排序时,我不介意,但事实是每篇论文、书籍或任何其他内容中的常规符号总是从 1 开始对坐标进行减除。这似乎是一个狡辩,但事实是,在公式中,总是需要仔细考虑才能理解我们正在做的事情。当然,这对于矩阵来说要糟糕得多。

一个明显的解决方案只是稍微不同的重载:

double& Vector::operator[](int i) {
return coordinates[i-1] ;
}

所以我可以打字

double x1 = V[1];
V[2] = coord2;

它看起来很完美,除了一件事:这个 i-1 减法似乎是一个很好的小开销候选者。你会说非常小,但我从事的是计算力学,所以这通常是我们负担不起的。

那么现在(最后)我的问题是:你认为编译器可以优化它,还是有办法让它优化? (模板、宏、指针或引用困惑...)

逻辑上,在

double xi = V[i];

大多数时候括号之间的整数是文字(3 次迭代 for 循环除外),内联 operator[] 应该使它成为可能,对吗?

(抱歉这个问题)

编辑:

感谢您的所有评论和回答

我有点不同意人们告诉我我们习惯于 0 索引 vector 。从面向对象的角度来看,我看不出数学 Vector 是 0 索引的,因为它是用 0 索引数组实现的。我们不应该关心底层实现。现在,假设我不关心性能并使用映射来实现 Vector 类。然后我会发现将“1”映射到“第一个”坐标很自然。

也就是说,我尝试使用 1 索引的 vector 和矩阵,在编写一些代码之后,我发现每次使用数组时它都不能很好地交互。我以为 Vector 和容器 (std::array,std::vector...) 不会经常交互(意思是,在彼此之间传输数据),但看来我错了。

现在我有一个我认为争议较小的解决方案(请给我你的意见):每次我在某些物理环境中使用 Vector 时,我都会想到使用枚举:

enum Coord {
x = 0,
y = 1,
z = 2
};
Vector V;
V[x] = 1;

我看到的唯一缺点是这些 x、y 和 z 可以在没有警告的情况下重新定义...

最佳答案

这个应该通过反汇编来测量或验证,但我的猜测是:getter 函数很小,它的参数是常量。编译器很有可能会内联函数并常量折叠减法。在这种情况下,运行时成本将为零。

关于c++ - 重载 operator[] 从 1 开始和性能开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855036/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com